ambito autorelease

voti
6

Mi chiedevo come l'autorelese funziona su iPhone. Ho pensato che una volta che si invia un autorelease a un oggetto è garantito da conservare in fino alla fine del campo di applicazione del blocco del autoreleaseè stato inviato. È corretto?

Stavo inizializzazione di una vista da un NIB nel applicationDidFinishLaunchingcome di seguito:

    (void)applicationDidFinishLaunching:(UIApplication *)application {

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

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

e la vista non ha mostrato a tutti, tutto quello che c'era sullo schermo è stata la UIWindow

Ora, una volta ho rimosso la autoreleasedalla fine del inizializzazione del controller tutto è andato liscio da lì.

Cosa riguarda?

Salute, K.

È pubblicato 24/02/2009 alle 14:57
fonte dall'utente
In altre lingue...                            


4 risposte

voti
13

Quando si chiama autorelease, si dà la proprietà dell'oggetto alla piscina autorelease corrente. Il ciclo corsa crea un nuovo pool autorelease prima che invia un evento (ad esempio applicationDidFinishLaunching:) e distrugge quella piscina quando l'evento finisce.

Quando si dà la proprietà della vostra LoginViewControlleralla piscina autorelease, che viene rilasciato solo dopo che i applicationDidFinishLaunching:rendimenti. Quando il controller della vista stessa rilascia, rimuove la sua vista dal superview (la finestra in questo caso).

Il delegato applicazione deve mantenere la proprietà della LoginViewControllere releasenella applicazione del delegato deallocmetodo (o quando hai finito con il tuo login e passati a un'altra visualizzazione).

Risposto il 24/02/2009 a 20:50
fonte dall'utente

voti
4

Per espandere sulla risposta di Don, può essere motivo di confusione per dire "si dà la proprietà dell'oggetto alla piscina autorelease corrente." Questo potrebbe essere frainteso significare l'oggetto è garantito per essere distrutta quando la piscina autorelease viene scaricata. Questo non è corretto (anche se accadrà in questo caso). L'invio di -autoreleaserichieste che la piscina autorelease invia un -releasemessaggio quando viene scaricata. Se questo -releasemessaggio fa retainCount = 0, l'oggetto verrà distrutto.

Così, al fine di fare ciò che Don raccomanda, è necessario creare un Ivar per tenere traccia di questo controller della vista. La sua spiegazione del perché la vista scompare è esattamente di destra; ma non si vuole far trapelare solo il controller della vista. Si vuole tenere su di esso, e rilasciarlo quando hai finito con esso.

@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];
}
Risposto il 28/04/2009 a 23:13
fonte dall'utente

voti
0

Dal momento che si sta aggiungendo il vostro LoginViewControlleral pool autorelease è stato rilasciato alla fine del ciclo di esecuzione. Quando ciò accade si rilascia anche la sua vista e lo rimuove venga visualizzato.

Risposto il 24/02/2009 a 18:50
fonte dall'utente

voti
0

L'autoreleasepool viene pulita alla fine del runloop. Questo significa che fino a quando si richiama metodi e fare cose, è ancora lì.

Non vedo l'errore nel codice, ma la finestra viene mantenuto correttamente nel tuo esempio.

Risposto il 24/02/2009 a 15:09
fonte dall'utente

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