2010-09-07 24 views
8

Considere el siguiente programa:¿Por qué usar NSAutoreleasePool?

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    // Insert code here... 
    NSLog(@"Programming is Fun !"); 
    [pool drain]; 
    return 0; 
} 

No entiendo por qué se necesita pool allí como el mismo programa se puede también escribir como este:

int main (int argc, const char * argv[]) { 
    NSLog(@"Programming is Fun !"); 
    return 0; 
} 

¿Qué es un propósito de utilizar un auto lanzamiento de grupo? ¿Por qué y cuándo los necesitamos? ¿Son obligatorios en cada programa objetivo C?

Si no quiero liberar automáticamente ningún objeto, ¿también necesito usar un grupo de autorelleno?

Respuesta

7

Pero si yo no quiero disparador automático de cualquier objeto, entonces también ¿Es necesario utilizar la piscina automático de lanzamiento ??

También tenga en cuenta que la biblioteca de cacao utiliza ampliamente autorelease. Así, incluso si piensa que no usa el grupo en su código, debe preparar el grupo.

5

NSObject contiene una función llamada ordenada autorelease. Esto significa que todos los objetos en Objective-C contienen esta función.

Esta función inserta self en la piscina autorelease, lo que retrasa la llamada de objetar release función hasta que se cancela la asignación de la piscina autorelease. La mayoría de las API internas usan un grupo de autorrelease, y además del que se encuentra en main(), hay uno asignado y desasignado en el bucle principal de UIKit en cada pase.

En resumen: es la cola para la disminución retardada del contador de referencia.

Ejemplo en donde se oculta autorelease:

[NSString stringWithUTF8String:"some string"]; 

Este objeto se asigna, y autorelease se llama en él. ¿Cómo lo usarías tú mismo?

MyObject *obj = [[[MyClass alloc] init] autorelease]; 

¿Por qué es esto bueno? Cuando devuelve este objeto, la función de llamada no necesita tener cuidado para liberar este objeto, y opcionalmente puede retenerlo (pero no tiene que hacerlo).


Ampliar y aclarar cuatro años más tarde:

Mientras UIKit y AppKit crear y drenar un NSAutoreleasePool durante el curso de su runloop principal, en su programa de interfaz gráfica de usuario no necesita crear usted mismo. Varios códigos esperan tener presente un NSAutoreleasePool, y como no inicializó un marco de GUI ni lo usa, no hay ningún código que lo cree mágicamente.

Mientras NSLog() y una constante NSString en su ejemplo no requieren una piscina, incluso lo trivial [NSMutableArray array] hace, dado que en realidad puede ser interpretado como [[[NSMutableArray alloc] init] autorelease].

0

He encontrado la razón ... "Si una agrupación no está disponible, los objetos liberados automáticamente no se liberan y se pierde memoria. En esta situación, el programa normalmente registrará los mensajes de advertencia adecuados."

+0

Si encuentra otra respuesta particularmente útil, siéntase libre de "subirla", y/o marcarla como correcta. –

0

Normalmente no tiene que crear un bloque de agrupación de autorrelease usted mismo, o incluso ver el código que se utiliza para crear uno Tres ocasiones en las que puede usar sus propios bloques de pool de autorelease,

  • Si está escribiendo un programa que no se basa en una infraestructura de interfaz de usuario, , como una herramienta de línea de comandos.

  • Si se escribe un bucle que crea muchos objetos temporales - Se puede usar un bloque piscina autorelease dentro del bucle a disponer de esos objetos antes de la próxima iteración. El uso de un bloque de agrupación de liberación automática en el bucle ayuda a reducir el espacio de memoria máximo de la aplicación.

  • Si genera una secuencia secundaria: debe crear su propio bloque de agrupación de liberación automática tan pronto como la secuencia comience a ejecutarse; de lo contrario, su aplicación perderá objetos.