Qual è giusto? Questo:Gestione della memoria ed eseguiSelectorInBackground:
NSArray* foo = [[NSArray alloc] initWithObjects:@"a", @"b", nil];
[bar performSelectorInBackground:@selector(baz:) withObject:foo];
- (void)baz:(NSArray*)foo {
...
[foo release];
}
Oppure:
NSArray* foo = [[[NSArray alloc] initWithObjects:@"a", @"b", nil] autorelease];
[bar performSelectorInBackground:@selector(baz:) withObject:foo];
- (void)baz:(NSArray*)foo {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
...
[pool release];
}
So che il primo funziona, ma Clang lamenta, quindi mi chiedo se c'è un modello migliore da utilizzare.
avrei "cerco solo fuori" il 2 °, ma con autoreleasing, chi sa se l'assenza di EXC_BAD_ACCESS
significa che si sta facendo bene o che hai appena avuto fortuna ...
Oh, è proprio lì nella documentazione! Silly me. :) – lawrence
Devo chiarire: è necessario creare e svuotare un pool di autorelease all'interno di -baz :, a meno che non si sappia che non verrà inviato un metodo di auto-autorizzazione all'interno. La migliore regola empirica consiste nell'assumere che ciò accada e creare/drenare un pool di autorelease, come nell'esempio 2. Ma utilizzare [pool drain], non [release pool]. –
Esattamente come diceva Jim Dovey: di solito è necessario creare un pool di autorelease come per la funzione principale (vedere Guida alla programmazione dei thread). È solo importante capire che questo pool non ha nulla a che fare con la autorelease di foo. –