AVISO: Cualquier pregunta que no cumpla ninguno de estos criterios podrá ser borrada sin previo aviso.

1
1

Abro esta pregunta para resolverme una duda personal y, de paso, generar un poco de opinión. Mi pregunta es qué argumentos tenéis a favor y en contra del uso de la gestión manual frente a la gestión hecha por el sistema mediante un recolector de basura. En iOS tenemos que lidiar con la gestión manual pero en Mac se puede activar el recolector.

Si programas en Mac, ¿activas el gestor de basura? ¿por qué? ¿crees que es más importante la facilidad de programación y la eliminación de fuentes de fallos o el control sobre la gestión? Si prefieres controlar la gestión, ¿por qué la gestión manual es más eficaz que la automática? ¿son los tiempos de la gestión automática apreciables o son despreciables en cuanto al rendimiento de la aplicación?

Yo no tengo una opinión demasiado fundada sobre este tema, uso la gestión manual porque no hay más remedio pero habiendo venido de Java creo que sin duda la gestión automática nos libra de pequeños fallos que si bien en un alto porcentaje de veces son triviales de resolver (se me olvida un retain, he hecho un release donde no debo) hay otras veces que se tornan difíciles de encontrar y, para qué nos vamos a engañar, quitan un tiempo precioso.

Si a eso le añadimos debates como este está claro que la gestión de memoria no es trivial.

preguntado 21 Feb '11, 13:11

emenegro's gravatar image

emenegro
3.7k163264


Creo que la respuesta más honesta es “depende”.

Y de todos modos el de Java no es un buen ejemplo: usar el garbage collector en Objective C no te libra de tener que controlar tu aplicación con Instruments o shark.

¿Por qué depende? A veces puede convenir utilizar el mínimo común denominador si por ejemplo quieres reutilizar tu código en MacOS y iOS. O puede ser que usar garbage collection en un parser XML no sea lo más indicado aunque estés en MacOS (y este último caso es curiosamente un buen ejemplo de cuando deberíamos usar autorelease pools en iOS).

En cuanto al tener que controlar siempre la aplicación, es importante tener en cuenta que el ecosistema de MacOS es mixto y puede ser que quieras utilizar alguna librería o código que no sea tuyo.

Como ves no se trata de una cuestión de confiabilidad o querer controlar la gestión: lamentablemente aprender a gestionar la memoria manualmente es una condición para programar en Objective C. Como todas las herramientas de bajo nivel, Objective C da un control granular pero nos obliga a estudiar más.

Probablemente en algún momento llegue el garbage collector a iOS, pero de todos modos aprender a gestionar la memoria manualmente es importante y es una condición para poder encontrar problemas cuando activemos el garbage collector.

enlace permanente

respondido 21 Feb '11, 23:29

Iv%C3%A1n%20Leider's gravatar image

Iván Leider ♦
1.4k626

He de reconocer que no he usado autorelease pool más que cuando lanzo un hilo secundario. ¿Alguna directriz, documento o consejo para usarlas? ¿Cuándo son buena idea?

(21 Feb '11, 23:38) emenegro

Muchas gracias, le echaré un ojo.

PD: a juanmac, aún no quiero aceptar respuesta hasta que alguien más se pronuncie ;)

(22 Feb '11, 09:51) emenegro

Menos mal que lo has dicho. Me estaba volviendo loco por que pensaba que no se estaba guardando los cambios... xDDD

(22 Feb '11, 10:21) juanmac ♦

Jaja, sí, era un poco lío xD Una pregunta, sólo pueden aceptar respuestas de preguntas ajenas los administradores, ¿no?

(22 Feb '11, 10:26) emenegro

Supongo que sí... Yo es que empecé a ser admin desde muy al principio y no he vivido mucho como user raso... Pregúntale a Blind, seguro que el lo sabe... xD

(22 Feb '11, 11:34) juanmac ♦
mostrando 5 de 6 mostrar todos

El garbage collector es una tecnologia muy fácil de utilizar, pero tiene su limitaciones: cuando la aplicación se está ejecutando, el garbage collector hace un recorrido por todos los objetos que hay en memoria (se hace en cada bucle de la aplicación - Run Loop) y verifica el valor del Retain Count de cada objeto. Ahora, te puedes imaginar que cuando la cantidad de objetos en memoria es enorme (imagínate una app que gestiona video como iMovie o fotos como iPhotos) esta verificación puede tardar bastante y disminuir las prestaciones de la aplicación. Si tu aplicación hace procesado de videos en tiempo real, te aconsejo utilizar la gestión manual de la memoria. Además, en este caso deberías utilizar poco el -autorelease. Y esto es otro punto. Hay una diferencia substancial entre el -release y el -autorelease. El primero baja de uno el Retain Count y si el valor es cero, el objeto viene cancelado de la memoria. El -autorelease añade el objeto al Autorelease Pool y se queda ahí hasta que este último viene borrado de la memoria. Si estás manejando muchos objetos (por ejemplo, creando objetos en un bucle), te aconsejo añadir estos objetos a un nuevo Pool (que te puedes crear localmente) y finalmente, hacer un -release del nuevo Pool. De esta forma, los objetos creados se añaden a tu Pool y no al Pool principal, así el footprint de la memoria de la aplicación se mantiene constante.

enlace permanente

respondido 27 Feb '11, 07:17

geppy's gravatar image

geppy
706516

Tu respuesta:
Activar/desactivar vista previa

Sobre esta pregunta

Etiquetas de la pregunta:

×31

Pregunta realizada el: 21 Feb '11, 13:11

Pregunta visitada: 1,111 veces

Última modificación: 27 Feb '11, 07:17

Seguir esta pregunta

Por Email:

Una vez que entres podrás suscribirte desde aquí para recibir actualizaciones

Por RSS:

Respuestas

Respuestas y Comentarios

Realizar Donación