gold

Las 3 reglas de oro de la gestión de memoria en Cocoa & Objective C

Gestió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.

  1. Todo objeto tiene un «retain count», que a «grosso modo»viene a ser un recuento de cuantos otros objetos hacen referencia a él.
  2. Cuando creas un objeto con los mensajes alloc o copy, dicho objeto tendrá un recuento de 1.
  3. Cuando le mandas el mensaje release o autorelease a un objeto, decrementas en una unidad dicho «retain count».
  4. Cuando le mandas el mensaje retain, dicho recuento aumenta en una unidad.
  5. 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.

Pues si tenemos esto claro, ya podemos pasar a las 3 reglas que impedirán que tengamos filtrados de memoria (objetos que nunca son destruidos), o pero aún, errores de acceso (intentar usar un objeto que ya ha sido destruido) que cuelguen nuestro programa, nos hagan quedar en ridículo y hagan que nuestra App sea rechazada por Apple.

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).
  1. 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.
  2. 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.
  3. Tercera regla: Si has creado ese objeto temporal de cualquier otra forma que no sea con alloc o copy, no tienes que hacer nada.

Con esto estarás seguro el 99% de los casos. De los otros caso excepcionales, ya hablaremos otro día.

 

Fernando Rodríguez

Sígueme en twitter.
Cursos de desarrollo iPhone

Acerca de Fernando Rodriguez

Fundador & Editor Jefe de justcodeit, Fernando Rodríguez (@frr149 & Linkedin) es desarrollador & un experto en la enseñanza de máxima calidad en programación y desarrollo para dispositivos iOS, Cocoa Touch, Objective C, Swift, Python, entre otros, aunque su mejor carta de presentación, es la opinión de sus alumnos: http://keepcoding.io/es/testimonio/ CLO en KeepCoding & Arunovo. Instructor de iOS Avanzado del Big Nerd Ranch. Profesor Asociado de la U-tad, autor invitado de revistas como iPhoneWorld, Applesfera.com & ponente habitual en conferencias dentro y fuera de España (iOSDevUK, CodeMotion, BCNDevCon, etc). En sus vidas anteriores fue un nerd de Python y Django, mago de Smalltalk, y para su pesar, galeote de C++ y un gran cocinero.

Share this:

Leave a comment