viernes, 9 de julio de 2010

Manejo de memoria en Objective-C

Una de las cosas que más me ha dado más trabajo por el momento en Objective-C es el manejo de memoria (la otra cosa es el diseño de la interfez de usuario con Interface Builder, pero ese es otro tema).

Desde hace muchos años, trabajo con lenguajes donde no había que preocuparse por el manejo de memoria, o bien porque el lenguaje tenía garbage collector (C#, Java) o bien porque la herramienta ocultaba el problema (GeneXus, por ejemplo con el generador C/SQL).

La última vez que me había tenido que preocupar por el manejo de memoria había sido en la facultad (hace más de 10 años), cuando en algún curso usamos C y C++...

En Objective-C creo que no es tan complicado como en C, pero igual suele dar bastantes dolores de cabeza.

Un buen recurso para empezar a ver el tema, es la documentación de Apple al respecto.

Los problemas de memoria suelen ser difíciles de diagnosticar, y hay de dos clases:
  1. Cuando se libera la memoria antes de tiempo (los más complicados), el programa cancela de forma aparentemente aleatoria, en distintos puntos en las sucesivas ejecuciones.
  2. Cuando no se libera memoria que ya no está en uso (memory leak), que para el programa no tiene ningún efecto negativo, pero que puede llegar eventualmente a dejar sin memoria al dispositivo. Estos casos se pueden detectar más fácilmente ejecutando en XCode con Run -> Performance Tools -> Leaks.
Las reglas que se deben seguir para saber cuando liberar memoria son:
  1. Si uno crea un objeto (mediante la función alloc, o alguna función que contenga "new" o "copy"), es responsable de liberarlo más adelante enviándole un mensaje "release".
  2. Si uno no crea el objeto (es el resultado de alguna otra invocación), entonces no es el dueño del mismo, y no tiene que liberarlo. Al no ser el dueño, puede ser que el objeto sea liberado en cualquier momento, y no tenemos control de esto.
  3. Si uno quiere "apoderarse" de un objeto, debe enviarle un mensaje "retain".
¿Simple, no? Lo que cuesta más es acostumbrarse...

5 comentarios:

  1. jaja.... JAJAJA.... JUAAAJUAAA JUUAAA... gente grande y aun usando el malloc....

    ResponderEliminar
  2. No, nada que ver... no uso más el "malloc"

    En objective-C es "alloc" nomás. La ventaja es que no tenés que pasarle el tamaño del objeto como en C, se da cuenta solito (es re-inteligente...).

    ResponderEliminar
  3. Que recuerdos por favor!!!!

    Eso si era programar, C pelado carajo.

    ResponderEliminar
  4. Buenos recuerdos C los hay, dos por tres no sabias por que fuckin daba segmentation fault...

    ResponderEliminar
  5. ahora el manejo de memoria se hace de una manera distnta en obj c, para eso existe el ARC, se podria decir que es el garbage collector de IOS, es bueno saber que ya no tenemos que liberar la memoria. :D
    saludos!,

    ResponderEliminar