αυτόματης κυκλοφορίας πεδίο

ψήφοι
6

Αναρωτιόμουν πώς λειτουργεί η autorelese για το iPhone. Νόμιζα ότι μόλις σας στείλουμε ένα αυτόματης κυκλοφορίας σε ένα αντικείμενο που είναι εγγυημένη για να παραμείνει στο μέχρι το τέλος του πεδίου του μπλοκ του autoreleaseεστάλη. Αυτό είναι σωστό?

Ήμουν προετοιμασία θέα από NIB στην applicationDidFinishLaunchingόπως πιο κάτω:

    (void)applicationDidFinishLaunching:(UIApplication *)application {

    loginViewController = [[[LoginViewController alloc] initWithNibName:@LoginView bundle:nil] autorelease];

    [window addSubview: [loginViewController view]];
    [window makeKeyAndVisible];
}

και η θέα δεν έδειξε καθόλου, όλα ήταν εκεί η οθόνη ήταν η UIWindow

Τώρα μόλις έβγαλα το autoreleaseαπό το τέλος της προετοιμασίας ελεγκτή όλα πήγαν ομαλή από εκεί.

Περί τίνος πρόκειται?

Cheers, Κ

Δημοσιεύθηκε 24/02/2009 στις 14:57
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
13

Όταν καλείτε autorelease, να σας δώσει την κυριότητα του αντικειμένου στο τρέχον απόθεμα αυτόματης. Ο βρόχος τρέχει δημιουργεί ένα νέο απόθεμα αυτόματης πριν να αποστέλλει ένα συμβάν (όπως applicationDidFinishLaunching:) και καταστρέφει ότι στην πισίνα, όταν η εκδήλωση τελειώνει.

Όταν δίνετε την ιδιοκτησία του σας LoginViewControllerστο απόθεμα αυτόματης, παίρνει κυκλοφορήσει λίγο μετά τις applicationDidFinishLaunching:επιστροφές. Όταν ο ίδιος ο ελεγκτής άποψη αποδεσμεύει, αφαιρεί την άποψή του από την superview (το παράθυρό σας σε αυτή την περίπτωση).

Αντιπρόσωπος της εφαρμογής σας θα πρέπει να κρατήσει την ιδιοκτησία του LoginViewControllerκαι releaseαυτό στον εκπρόσωπο εφαρμογής deallocτης μεθόδου (ή όταν τελειώσετε με τη σύνδεσή σας και έχουν μετακινηθεί σε άλλη προβολή).

Απαντήθηκε 24/02/2009 στις 20:50
πηγή χρήστη

ψήφοι
4

Για να αναπτύξετε την απάντησή του Don, μπορεί να είναι κάπως συγχέοντας για να πει «σας δώσει την κυριότητα του αντικειμένου στο τρέχον απόθεμα αυτόματης». Αυτό θα μπορούσε να παρεξηγηθεί ότι σημαίνει το αντικείμενο είναι εγγυημένη για να καταστραφεί όταν το απόθεμα αυτόματης στραγγίζεται. Αυτό δεν είναι σωστό (αν και αυτό θα συμβεί σε αυτή την περίπτωση). Η αποστολή -autoreleaseτων αιτήσεων που το απόθεμα αυτόματης στείλετε ένα -releaseμήνυμα, όταν αδειάζει. Αν αυτό -releaseτο μήνυμα κάνει retainCount = 0, τότε το αντικείμενο θα καταστραφεί.

Έτσι, προκειμένου να κάνει ό, τι συνιστά Don, θα πρέπει να δημιουργήσετε ένα Ivar για να παρακολουθείτε αυτόν τον ελεγκτή άποψη. εξήγηση του γιατί η θέα χάνεται είναι ακριβώς σωστό? αλλά δεν θέλετε να διαρρεύσει ακριβώς τον ελεγκτή άποψη. Θέλετε να κρατήσουν αυτό, και αφήστε το όταν τελειώσετε με αυτό.

@interface ... {
   LoginViewController *_loginViewController;
}

@property (readwrite, retain) LoginViewController *loginViewController;

@implementation ...
@synthesize loginViewController = _loginViewController;

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    self.loginViewController = [[[LoginViewController alloc] initWithNibName:@"LoginView" bundle:nil] autorelease];

    [window addSubview: [loginViewController view]];
    [window makeKeyAndVisible];
}

- (void)dealloc {
    [_loginViewController release]; _loginViewController = nil;
    [super dealloc];
}
Απαντήθηκε 28/04/2009 στις 23:13
πηγή χρήστη

ψήφοι
0

Από τη στιγμή που προσθέτετε σας LoginViewControllerστο απόθεμα αυτόματης είναι να κυκλοφορήσει στο τέλος του βρόχου τρέξιμο. Όταν συμβαίνει αυτό απελευθερώνει επίσης την άποψή του και να απομακρύνει από το να εμφανίζεται.

Απαντήθηκε 24/02/2009 στις 18:50
πηγή χρήστη

ψήφοι
0

Η autoreleasepool καθαρίζεται στο τέλος του runloop. Αυτό σημαίνει ότι για όσο διάστημα θα επικαλεστεί τις μεθόδους και να κάνουμε πράγματα, είναι ακόμα εκεί.

Δεν βλέπω το λάθος στον κώδικα σας, αλλά το παράθυρο διατηρείται σωστά το παράδειγμά σας.

Απαντήθηκε 24/02/2009 στις 15:09
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more