ios memory-management objective-c-blocks autorelease nsautoreleasepool

iOS bloques de pool de autorelease



memory-management objective-c-blocks (3)

(Principalmente, solo le doy un poco de información adicional; @ Kibitz503 lo está llevando a la respuesta correcta).

@autoreleasepool { MyObject *obj = [[MyObject alloc] init]; // no autorelease call here /* use the object*/ //.... // in the end it should get deallocated because it''s lifespan ends, right? // so why do we need to call autorelease then?! }

PD: Por favor, no me digas que debido a ARC no necesitamos hacer algunas cosas porque ARC se encarga de ellos. Soy plenamente consciente de eso, pero quiero dejar de lado ARC por unos momentos para comprender el mecanismo de gestión de la memoria.

OK, no consideremos ARC. En lo anterior, sin ARC, obj no sería desasignado. Solo porque ARC agrega llamadas de release adicionales posiblemente se desasigne (dado su ejemplo, en realidad no tenemos idea, ya que no sabemos qué sucede al use the object ).

Como explica @ Kibitz503, "liberar" no significa "desasignar". Al final del bloque, el conjunto de drenajes de liberación automática, lo que significa que cualquier autorelease pendiente de autorelease se envía como release al final del bloque. Si eso lleva a que el objeto alcance una cuenta de retención de 0, entonces se desasigna.

Pero si lo anterior está en un bloque o no, sin ARC es una fuga.

Estaba leyendo la documentación de Apple acerca de la administración de la memoria cuando pude cerrar automáticamente los bloques de grupo y algo me hizo pensar.

Any object sent an autorelease message inside the autorelease pool block is released at the end of the block.

No estoy seguro de entender esto completamente. Cualquier objeto creado dentro de un bloque de grupo de autorelease se libera al final del bloque de todos modos porque es su vida útil. ¿Por qué necesitarías llamar autorelease al objeto cuando se liberará de todos modos cuando llegue al final del bloque?

Para ser más claro, daré un ejemplo de lo que estoy pensando:

@autoreleasepool { MyObject *obj = [[MyObject alloc] init]; // no autorelease call here /* use the object*/ //.... // in the end it should get deallocated because it''s lifespan ends, right? // so why do we need to call autorelease then?! }

PD: Por favor, no me digas que debido a ARC no necesitamos hacer algunas cosas porque ARC se encarga de ellos. Soy plenamente consciente de eso, pero quiero dejar de lado ARC por unos momentos para comprender el mecanismo de gestión de la memoria.


Autorelease simplemente elimina una cuenta de retención del objeto, no "libera" la memoria inmediatamente como en c. Cuando el grupo de autorelease finalice, todos los objetos lanzados automáticamente con un conteo de 0 tendrán su memoria liberada.

A veces creas muchos objetos. Un ejemplo sería un bucle que está creando nuevas cadenas cada vez que itera y agrega nuevos datos a la cadena. Es posible que no necesite las versiones anteriores de la cadena y querrá liberar la memoria utilizada por ellas. Puede lograr esto utilizando explícitamente el grupo de autorelease en lugar de esperar a que se haga de forma natural.

//Note: answers are psudocode //Non Arc Env @autoreleasepool { MyObject *obj = [[MyObject alloc] init]; // no autorelease call here //Since MyObject is never released its a leak even when the pool exits } //Non Arc Env @autoreleasepool { MyObject *obj = [[[MyObject alloc] init] autorelease]; //Memory is freed once the block ends } // Arc Env @autoreleasepool { MyObject *obj = [[MyObject alloc] init]; //No need to do anything once the obj variable is out of scope there are no strong pointers so the memory will free } // Arc Env MyObject *obj //strong pointer from elsewhere in scope @autoreleasepool { obj = [[MyObject alloc] init]; //Not freed still has a strong pointer }


Los grupos de autorelease aplazan la liberación del objeto hasta el final del grupo, lo que evita la posibilidad de que se libere antes de que llegue al final. Básicamente, es para asegurarse de que el objeto no se lanzará antes del final de la agrupación.