2008-10-08 19 views
25

La documentación para +[NSThread detachNewThreadSelector:toTarget:withObject:] dice:NSAutoreleasePool en NSOperation principal?

para aplicaciones no-recogida de basura, el método aSelector es responsable para la creación de una piscina autorelease para el hilo recién separada y liberando esa piscina antes de que salga.

Mi pregunta es, ¿qué necesito para crear mi propia NSAutoreleasePool en mi anulación del método -[NSOperation main], o es la creación de la NSAutoreleasePool manejado por NSOperation?

Respuesta

12

Sí, lo hace. Está definiendo una pieza de trabajo independiente que NSOperationQueue ejecutará en "algunos" hilos, por lo que es responsable de administrar la memoria en esa pieza de trabajo.

2

Sí, es necesario crear un NSAutoreleasePool en su método de [NSOperation main], a menos que usted está creando un "concurrente" (un poco desafortunado nomenclatura) NSOperation subclase y su [NSOperation start] método anulado crea la NSAutoreleasePool antes de llamar `[NSOperation principal].

La documentación de la clase NSOperation tiene una buena descripción de todo esto: http://developer.apple.com/documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html.

6

No necesita crear su propio NSAutoreleasePool en su main, el sistema lo hace por usted. Para ver esto, use el comando de menú Xcode Ejecutar> Mostrar> Puntos de interrupción para abrir la ventana Puntos de interrupción y escriba: - [NSAutorelease Init]

Ahora ejecute su programa, y ​​verá que se crea un grupo de autorrelease dentro de NSOperation .

Vea también ejemplos de Apple, por ejemplo, http://developer.apple.com/Cocoa/managingconcurrency.html que no crean su propio grupo de autorrelease.

+0

Creo que tienes que hacerlo si no son mainThread NSOperations, sobre la base de los otros comentarios aquí. – mxcl

0

sí, lo necesita.

- (void) main 
{ 
    NSAutoreleasePool *thePool = [[NSAutoreleasePool alloc] init]; 
    //your code here 
    //more code 
    [thePool release]; 
} 

si no se crea una piscina autorelease, cualquier clase de confort-inicializador (como [NSString stringWithFormat:]) se escape ya que estos inicializadores vuelven objetos autoreleased.

+0

De acuerdo con la Documentación de Apple, no debe llamar al lanzamiento de un autoreleasePool, debe llamar a drain. –

14

Una buena pregunta, incluso los propios documentos de Apple y el código de ejemplo no son muy claros al respecto. Creo que he encontrado la respuesta sin embargo:

Puesto que estas operaciones son Objective-C objetos, siempre se debe crear un grupo de autorelease temprano en la ejecución de su código de tarea. Un grupo de autorelease proporciona protección contra la fuga de objetos Objective-C que se liberan automáticamente durante la ejecución de su tarea . Aunque es posible que ya sea un grupo creado por cuando se ejecuta el código personalizado, nunca debe confiar en ese comportamiento y siempre debe proporcionar el suyo.

Básicamente, a pesar de que puede haber un grupo en el lugar como David mencionó, aún debe crear el suyo propio.

Cuestiones relacionadas