Posterior a de una extensa selección de información dimos con la respuesta este dilema que pueden tener algunos los usuarios. Te ofrecemos la respuesta y nuestro deseo es que te resulte de gran apoyo.
Solución:
La Guía de programación de gestión de memoria para Cocoa pronto será tu mejor amiga. En resumen, las instancias de objetos en Cocoa se administran mediante la memoria mediante el recuento de referencias (a menos, por supuesto, que esté utilizando la recolección de elementos no utilizados en OS X). Un objeto indica que quiere ‘retener’ un interés de propiedad en otra instancia (evitar que se desasigne) enviándole un -retain
mensaje. Un objeto indica que quiere liberar ese interés enviando a la otra instancia un -release
mensaje. Si el número de objetos que han ‘retenido’ y el interés de propiedad en un objeto cae a 0 (es decir, cuando la última de las instancias propietarias envía un -release
mensaje), se desasigna la instancia con un recuento de retención de 0.
A veces es conveniente decir “Quiero que se libere esta instancia algún día en el futuro“. Ese es el propósito de -autorelease
. enviando un -autorelease
mensaje agrega el receptor a la actual NSAutoreleasePool
. Cuando esa piscina se drena, envía un -release
mensaje a todas las instancias del grupo. Un NSAutoreleasePool
se crea automáticamente al comienzo de cada iteración del ciclo de ejecución de cada subproceso y se vacía al final de esa iteración. Por lo tanto, puedes hacer algo como esto en un método:
- (id)myMethod
return [[[MyObject alloc] init] autorelease];
La persona que llama a este método obtendrá una instancia que puede -retain
si quieren conservarlo. Si no lo retienen, permanecerá al menos hasta que se drene el grupo de autoliberación adjunto:
- (void)someOtherMethod
...
id instance = [obj myMethod];
... // do more with instance, knowing that it won't be dealloc'd until after someOtherMethod returns
Liberar significa que lo liberas de inmediato. Liberación automática significa que desea que la variable se libere en el siguiente grupo de liberación automática.
Utiliza la liberación automática cuando desea mantener la variable pero no desea crear una pérdida de memoria. Usas release cuando ya no necesitas la variable.
Muestra:
- (NSNumber *)return5
NSNumber * result = [[NSNumber alloc]initWitnInt: 5];
[result autorelease];
return result;
¿Por qué usamos autorelease allí?
si usamos [result release] en cambio, el resultado variable se destruirá EN ese momento. Lo que significa que el valor devuelto será basura.
Si no soltamos nada, variable result
será retenido PARA SIEMPRE incurriendo en pérdida de memoria.
Podemos decirle a cada persona que llama a la función que libere el resultado, pero eso sería un dolor de cabeza y propenso a errores.
Así que usamos la liberación automática. Marcamos la variable que se liberará en el próximo grupo de liberación automática. Básicamente, marcamos la variable que se liberará cerca de alloc. Por lo tanto, el mantra alloc se empareja con la liberación en la misma función que se mantiene todo el tiempo.
En realidad, te irá bien si cambias todas las versiones a versiones automáticas. Su uso de la memoria no será eficiente, sin embargo, el efecto es mínimo. Todas las variables, en todos los lenguajes de programación, se liberan automáticamente.
De todos modos, usa ARC.
discusión de fondo:
El objetivo-c es un conteo de referencias, por lo que los objetos se eliminan cuando el conteo de referencias llega a 0. La versión reduce el conteo de referencias inmediatamente, la liberación automática lo reduce cuando se abre el grupo de autoliberación.
cuándo usar:
use la liberación automática al asignar el objeto si
- no lo necesita después de la función actual
- será retenido por algún otro objeto/función y será liberado más tarde por el código de retención
- cuando la lógica de la función actual es complicada, por lo que tendría que enviar la liberación en una docena de lugares diferentes antes de realizar una devolución
usar liberación “manual”
- para revertir una retención anterior (en caso de que esté implementando una biblioteca)
- si necesita un control preciso de la liberación de objetos (por ejemplo, usan mucha memoria o el grupo de liberación automática no aparecerá durante algún tiempo)
pero realmente mi amigo:
- lea la Guía de programación de administración de memoria para Cocoa como lo sugiere Barry y ejecute su código con instrumentos (zombies y fugas) a menudo para detectar todos y cada uno de los errores de administración de memoria.
erik
Acuérdate de que te damos el privilegio parafrasear tu experiencia si descubriste tu enigma justo a tiempo.