verificar revista lecturas horas home gubernamental etica ethos certificacion cdpe acceso objective-c cocoa cocoa-touch

objective-c - lecturas - revista ethos



¿Es realmente necesaria la liberación de objetos en la salida del programa? (4)

De hecho, no es necesario, pero si desea reciclar parte de su fuente y usarla en otro programa, es posible que tenga pérdidas de memoria. Además, nunca considere que el SO sea sin ningún defecto. Podría "olvidarse" de liberar algunos recursos.

Tengo una pregunta técnica Esta NO es una pregunta sobre la codificación correcta.

Mi pregunta es TÉCNICAMENTE: ¿es necesario liberar objetos en una salida / cierre de un programa?

En otras palabras, digamos por razones de argumento, tiene un botón que cierra su aplicación, pero justo antes de cerrar muestra una imagen y luego cierra la aplicación.

¿TIENE QUE TÉCNICAMENTE liberar esa vista de imagen antes de cerrar la aplicación? ¿La memoria se liberará automáticamente cuando el programa salga, o si no la suelta, la memoria se mantendrá de alguna manera "activa"?

Entiendo que "debería" publicarlo, mi pregunta es sobre el aspecto técnico y lo que sucede detrás de escena.

Gracias.


En el iPhone, no es necesario, y hasta donde yo sé, no se puede. Después de recibir applicationWillTerminate: tiene unos segundos para guardar su estado y luego el sistema operativo mata su proceso. Cree una de las aplicaciones de muestra y ponga un punto de interrupción en uno de los métodos dealloc. Nunca reciben un golpe.

Aquí hay un gran argumento al respecto: enlace de texto

Nota: Objectol C dealloc no es lo mismo que un C ++ Deconstructor. En un Deconstructor puede cerrar archivos, identificadores, etc. En Objective C dealloc es solo para liberar memoria. Debe cerrar sus otros recursos antes, ya que dealloc nunca podrá ser llamado.


No es necesario. Pero si está usando valgrind o una herramienta similar, pronto descubrirá que dejar toda su memoria colgando de pantanos con advertencias falsas.

En el lado de las cosas de Linux, el montón se crece utilizando la sbrk sistema sbrk . Esto aumenta el espacio total de la memoria del procesador en un bloque grande a la vez (por lo que solo se necesita un sbrk para proporcionar suficiente espacio para muchos malloc ). Cuando el proceso desaparece, el kernel recupera toda la memoria asignada por sbrk . Es por eso que estás a salvo. El kernel también cerrará cualquier descriptor de archivo abierto por ese único proceso.

Hay algunos problemas que pueden surgir. Si su proceso se realiza alguna vez en un momento inoportuno, cualquier descripción de archivo abierto se duplicará. He visto esto manifestarse como una conexión TCP misteriosamente colgando con vida después de que el proceso original murió, lo que es desagradable . Además, hay otros recursos que simplemente no tienen un alcance de proceso, por lo que no se recuperarán cuando el proceso fallezca. Esto incluye segmentos de memoria compartida, archivos temporales, canalizaciones con nombre y sockets de UNIX, y probablemente una gran cantidad de otros mecanismos de IPC.

¿En resumen? La memoria está bien. Los descriptores de archivos generalmente están bien. Algunas de las funciones más esotéricas del IPC se romperán horriblemente si no se limpian.


La liberación puede ayudarlo a encontrar errores. En la mayoría de los casos, los problemas de memoria dinámica se desencadenan en el momento de la liberación (por ejemplo, intenta liberar un objeto no válido). Siempre liberar puede ayudarlo a identificar errores que de otra manera serían difíciles de encontrar.