Autofreigabe Anwendungsbereich

stimmen
6

Ich habe mich gefragt , wie die autorelese auf dem iPhone funktioniert. Ich dachte , dass , sobald Sie ein Autofreigabe an ein Objekt senden gewährleistet ist , bis zum Ende des Umfangs des Blocks beibehalten in werden die autoreleasegesendet wurde. Ist das korrekt?

Ich war in dem eine Ansicht von einem NIB Initialisierung applicationDidFinishLaunchingwie folgt:

    (void)applicationDidFinishLaunching:(UIApplication *)application {

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

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

und die Ansicht nicht zeigen überhaupt, alles war da auf dem Bildschirm war UIWindow

Nun , wenn ich entfernte die autoreleasevom Ende der Reglerinitialisierung alle von dort auf glatten gingen.

Um was geht es hierbei?

Cheers, K.

Veröffentlicht am 24/02/2009 um 14:57
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
13

Wenn Sie anrufen autorelease, geben Sie Eigentum an dem Gegenstand des aktuellen Autofreigabepool. Die Laufschleife erzeugt einen neuen Autofreigabepool , bevor es ein Ereignis (wie die Versendungen applicationDidFinishLaunching:) und zerstört , dass Pool , wenn das Ereignis beendet ist .

Wenn Sie Eigentum an Ihrem geben LoginViewControlleran den Autofreigabepool, wird es kurz nach der Freigabe applicationDidFinishLaunching:zurückkehrt. Wenn die View - Controller freigibt selbst, entfernt es seinen Blick von der Superview (Fenster in diesem Fall).

Ihre Anwendung delegieren sollte das Eigentum an die halten LoginViewControllerund releasees in dem App - Delegat - deallocMethode (oder , wenn Sie mit Ihrem Login getan und haben zu einer anderen Ansicht bewegt).

Beantwortet am 24/02/2009 um 20:50
quelle vom benutzer

stimmen
4

Um auf Don Antwort zu erweitern, kann es etwas verwirrend sein , zu sagen : „Sie geben das Eigentum an dem Objekt zu dem aktuellen Autofreigabepool.“ Dies könnte falsch verstanden werden , um das Objekt zu verstehen , ist garantiert , zerstört werden , wenn der Autofreigabepool abgelassen wird. Das ist nicht richtig (obwohl es in diesem Fall passieren wird). Senden -autoreleasefordert , dass der Autofreigabepool eine senden -releaseNachricht , wenn es leer ist. Wenn diese -releaseNachricht retainCount macht = 0, dann wird das Objekt zerstört werden.

Also, um zu tun, was Don empfiehlt, müssen Sie ein Ivar erstellen Spur dieser View-Controller zu halten. Seine Erklärung, warum die Ansicht verschwindet genau richtig; aber Sie wollen nicht nur die View-Controller auslaufen. Sie wollen auf sie halten, und es freigeben, wenn Sie mit ihm fertig sind.

@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];
}
Beantwortet am 28/04/2009 um 23:13
quelle vom benutzer

stimmen
0

Da Sie Ihre Zugabe LoginViewControllerzu dem Autofreigabepool es wird am Ende der Laufschleife freigegeben. Wenn das passiert es setzt auch seine Ansicht und entfernt von ihm angezeigt wird.

Beantwortet am 24/02/2009 um 18:50
quelle vom benutzer

stimmen
0

Die autoreleasepool ist am Ende des Runloop gereinigt. Das bedeutet, solange Sie Methoden aufrufen und Dinge zu tun, es ist immer noch da.

Ich sehe nicht, den Fehler im Code, aber die Fenster richtig in Ihrem Beispiel beibehalten.

Beantwortet am 24/02/2009 um 15:09
quelle vom benutzer

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