11

Entiendo que debe tener cuidado con autorelease en iOS. Tengo un método que devuelve un objeto que es alloc s que necesita la persona que llama, por lo que en esta situación, tal como lo entiendo, debo enviar autorelease al objeto en el destinatario antes de que regrese.¿Cuándo se produce la liberación automática en Cocoa Touch?

Esto está bien, pero una vez que el control vuelve al teléfono (es decir, después de que se haya procesado el clic de mi botón) parece que se ha liberado el grupo de liberación automática. Sospecho que así es como debería ser, pero me pregunto cuál es la mejor práctica para esta situación.

He recurrido a enviar un mensaje retain de la persona que llama para que el objeto no sea liberado y luego liberarlo explícitamente en dealloc.

¿Es este el mejor enfoque?

Respuesta

21

El grupo de autorrelease normalmente se libera después de cada iteración del ciclo de ejecución. Aproximadamente, cada aplicación Cocoa y Cocoa Touch está estructurado de la siguiente manera:

Get the next message out of the queue 
Create an autorelease pool 
Dispatch the message (this is where your application does its work) 
Drain the autorelease pool 

Lo que usted describe es el comportamiento esperado. Si desea mantener un objeto por más tiempo que eso, tendrá que retenerlo explícitamente.

2

Sí, ese es el mejor enfoque. Autorelease es realmente solo para interacciones en código que usted conoce. Una vez que está almacenando un objeto, debe saber que el objeto que contiene una referencia no morirá/saldrá del alcance hasta que también haya terminado con el objeto o necesite retener el objeto.

1

Solo se garantiza que los objetos liberados automáticamente se lanzarán después del final de su método. Después de todo, el método que llamó a su método podría haber creado su propio grupo y liberarlo justo después de su método.

+0

Estrictamente hablando, incluso que no está garantizada, ya que es posible crear un grupo en un método, AutoRelease algunos objetos, y vaciar la piscina en otro método. Un diseño dudoso, pero válido: los objetos durarán desde la creación de la agrupación hasta el drenaje de la piscina, independientemente del método que haya creado la agrupación. –

13

El uso de autorelease es una forma de decir: "Objeto, ya no te quiero, pero voy a pasarte a otra persona que podría desearte, así que no desaparezcas por el momento". Por lo tanto, el objeto se mantendrá el tiempo suficiente como para devolverlo desde un método o dárselo a otro objeto. Cuando algún código quiere mantener el objeto, debe reclamar la propiedad por retain ing it.

Consulte the memory management guidelines para todo lo que necesita saber para usar autorelease correctamente.

+0

Buena respuesta PERO __es esto seguro__? ¿Hay algún ejemplo de un momento en que devuelva un objeto que '[[[alloc]] init] autorelease]', pero luego el objeto desaparece antes de que tuviera la oportunidad de usarlo? – bobobobo

+0

@bobobobo: no si está siguiendo las reglas de administración de memoria. El comportamiento de 'autorelease' es bastante predecible: el objeto se mantendrá hasta que se vacíe el grupo de autorrelease actual, lo que no ocurrirá hasta el final del ciclo de evento actual (a menos que lo hagas a propósito antes).Si, por ejemplo, señala una variable de instancia al objeto pero no la retiene y luego intenta acceder a ella mucho más tarde, el objeto se habrá ido antes de que tuviera la oportunidad de usarlo, pero eso se debe a que rompió la administración de memoria. contrato cuando no retuvo el objeto. – Chuck

3

Aquí es un examle proporcionada en the Apple Memory Management document:

– (id)findMatchingObject:(id)anObject 
{ 
    id match = nil; 
    while (match == nil) { 
     NSAutoreleasePool *subPool = [[NSAutoreleasePool alloc] init]; 
     /* Do a search that creates a lot of temporary objects. */ 
     match = [self expensiveSearchForObject:anObject]; 
     if (match != nil) { 
      [match retain]; /* Keep match around. */ 
     } 
     [subPool release]; 
    } 
    return [match autorelease]; /* Let match go and return it. */ 
} 
Cuestiones relacionadas