2011-07-06 16 views
7

NSAutoreleasePool ... ¿debería haber solo una? ¿Por qué querrías tener más de uno? ¿Alguna vez quisieras tener más de un grupo como parte de una sola clase?¿Podemos tener múltiples NSAutoReleasePools? ¿Por qué sería esto necesario?

Si tiene varias agrupaciones, ¿cuál contendrá el objeto que se solicitó ser [liberación automática] d? ¿Hay alguna manera de descubrir qué objetos están esperando ser liberados automáticamente como parte de un grupo?

Lo siento por 20 preguntas, por favor, me ayudan a entender esto mejor

Respuesta

12

NSAutoreleasePool .. debe haber único?

No, no necesariamente. Puede crear tantos conjuntos de autorreleases como desee/necesite.

¿Por qué querría tener más de uno? ¿Alguna vez desea tener más que un grupo como parte de una única clase ?

La idea es mantener su memoria "alta marca de agua" lo más baja posible. Usar la liberación automática es un poco engañoso para diferir la liberación de su objeto hasta "más tarde". A veces se sabe cuándo es "más tarde", y en estos casos, probablemente sea inteligente crear su propio grupo de autorrelease.

¿Qué quiero decir con todo esto? Bueno, imagine que tenía el siguiente bucle:

for (...) 
{ 
    // 1 MB of objects are added to the autorelease pool by some code... 
} 

1 MB es mucho! Si ese código se repite 20 veces, tendrías 20 MB de objetos esperando ser liberados. Peor aún, si se ejecuta por un número indefinido o indeterminado de veces su aplicación puede fallar. Si usted sabe que el código es autónomo puede forzar cualquier cosa que consigue poner en una piscina autorelease dentro de ese bloque para obtener puestos en libertad por la creación de su propia piscina autorelease manualmente, así:

for (...) 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    // 1 MB of objects are added to the autorelease pool by some code... 
    [pool drain]; 
} 

Ahora su marca "agua alta "es solo 1MB en lugar de 20MB (¡o más!).

Si tiene varias piscinas, cuál contendrá objeto que se le pidió para ser [autorelease] d?

La más reciente.

Imagine tener una pila global. Cuando inicia una nueva AutoreleasePool, se agrega a esta pila global de grupos de autorrelease. Cuando llama al [xxx autorelease] en un objeto, el método de liberación automática eche un vistazo al grupo de autorrelease en la parte superior de esta pila y se agrega a la lista de objetos del grupo de autorrelease. Cuando llama al [pool drain], ese conjunto recorre todas las referencias que se le han agregado y llama al [xxx release] en todas ellas.

Como señala BJ Homer, la pila en el párrafo anterior no es verdaderamente global, en realidad hay una pila por hilo. Pero no pude encontrar la manera de reescribir el párrafo anterior y mantenerlo fácilmente comprensible usando términos como "thread-local" ... así que ... este apéndice deberá ser suficiente:)

+1

Bueno, en realidad es un pila local de subprocesos, no una pila global.Pero por lo demás bien escrito. –

+0

@BJ Homer, gracias, buen punto. Publicación actualizada – Steve

Cuestiones relacionadas