¿Qué encontrarás en este post?
ToggleGestión de memoria en Cocoa & Objective C
Aunque Objetive-C 2.0 incluye un recolector de basura (gracias sean dadas al Altísimo), si quieres programar apps para iPhone, no puedes contar con ello. Desgraciadamente, a fecha de hoy (2011) en Cocoa Touch no es posible utilizar el GC (recolector de basura) puesto que su uso continuado gastaría la batería a demasiada velocidad, o al menos eso dice Steve Jobs. Por lo tanto, si quieres programar para iOS, no te queda más remedio que descender a los infiernos de la gestión manual de memoria. Esta es fuente de confusiones y bugs horrendos en todos los lenguajes que carecen de GC; no obstante, en Objetive-C tenemos la ventaja de que la “framework” (Cocoa) nos echa una mano haciéndose cargo de la mayor parte del trabajo pesado. Gracias a esto, basta con que recuerdes 3 reglas mnemotécticas (“rules of thumb”, que decimos los que hablamos Latín) para salir airoso en el 99% de los casos.Conceptos básicos de gestión de memoria en Objective C
Antes de pasar a la chuleta de las 3 reglas, conviene tener claros algunos conceptos.- Todo objeto tiene un “retain count”, que a “grosso modo”viene a ser un recuento de cuantos otros objetos hacen referencia a él.
- Cuando creas un objeto con los mensajes alloc o copy, dicho objeto tendrá un recuento de 1.
- Cuando le mandas el mensaje release o autorelease a un objeto, decrementas en una unidad dicho “retain count”.
- Cuando le mandas el mensaje retain, dicho recuento aumenta en una unidad.
- Cuando el recuento llega a cero, pasa a estar listo para ser destruido y el sistema le mandará el mensaje dealloc en algún momento del futuro próximo (no necesariamente de inmediato), y será destruido.
Las 3 reglas de la gestión de memoria en Cocoa
En general, sólo hay dos formas de usar objetos en Cocoa:- Como una variable de instancia (uso a largo plazo)
- Como un objeto temporal dentro de un método (uso a corto plazo).
- Primera Regla: Para las variables de instancia, usa SIEMPRE propiedades autogeneradas (@property y @synthesize). Esto es todo lo que tienes que recordar para las variables de instancia. Las demás reglas se refieren a los objetos temporales.
- Segunda regla: Para los objetos temporales, si los has creado llamando a alloc o a copy, eres responsable de llamar a release o autorelease al final del método en el que los has creado.
- Tercera regla: Si has creado ese objeto temporal de cualquier otra forma que no sea con alloc o copy, no tienes que hacer nada.