¿Cuál es la correcta? Este:Administración de la memoria y performSelectorInBackground:
NSArray* foo = [[NSArray alloc] initWithObjects:@"a", @"b", nil];
[bar performSelectorInBackground:@selector(baz:) withObject:foo];
- (void)baz:(NSArray*)foo {
...
[foo release];
}
O:
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];
}
sé el primero funciona, pero Clang queja por él, así que me pregunto si hay un patrón mejor utilizar.
Me "sólo trato a cabo" la segunda, pero con autoreleasing, quién sabe si la ausencia de EXC_BAD_ACCESS
significa que lo estás haciendo bien o que simplemente tuvo suerte ...
Oh, es justo ahí en la documentación! Tonto de mí. :) – lawrence
Debo aclarar: DEBES crear y drenar un grupo de autorrelease dentro de -baz :, a menos que SABES que nada se enviará ni un método de restauración allí dentro. La mejor regla empírica es suponer que sucederá y crear/drenar un grupo de autorrelease, como en el ejemplo 2. Pero use [pool drain], no [pool release]. –
Exactamente como dijo Jim Dovey: por lo general, necesita crear un grupo de liberación automática tal como lo hace para la función principal (consulte la Guía de programación de subprocesos). Es importante entender que este grupo no tiene nada que ver con la liberación automática de foo. –