Pregunta

Llegando al final del desarrollo de una aplicación para iPhone y me pregunto qué tan malo es usar la liberación automática cuando se desarrolla para el iPhone. Me enfrento a algunos bloqueos bastante aleatorios y, hasta ahora, no puedo identificarlo con otra cosa que no sea el uso de memoria descuidada.

Como novato de Cocoa, recuerdo haber leído inicialmente un documento guía que sugería encarecidamente evitar la liberación automática a favor de la retención / liberación manual para iPhone. Sin embargo, un desarrollador de Cacao más 'senior' se unió al principio (a quien irónicamente se le ha dejado ir desde entonces), que usó la liberación automática en todo el lugar. Es cierto que me metí en "mono ver mono hacer" modo, y parece estar volviendo a perseguirme (ahora soy el único desarrollador en el proyecto).

Entonces, ¿qué hacer a continuación? Me parece que tengo que ramificar el código e intentar revisar y reemplazar, cuando sea posible, el código de liberación automática manteniendo los dedos cruzados para que no rompa la aplicación sin querer. Parece que muchas llamadas a la biblioteca resultan en objetos lanzados automáticamente como stringWithFormat y prácticamente cualquier cosa donde no estoy usando alloc. ¿Algún otro gotchyas y / o sugerencias que debería estar buscando? Gracias gurús del cacao.

¿Fue útil?

Solución

El uso de la liberación en lugar de la liberación automática puede mejorar el uso de la memoria en espacios reducidos (lo cual es bueno en el iPhone), pero no ayudará en absoluto con el bloqueo si no sigue las reglas de retención / liberación. Leería algunos tutoriales sobre administración de memoria en Obj-C si todavía está un poco confuso sobre lo que debería estar haciendo, y luego iría después de esos bloqueos utilizando el depurador y los informes de bloqueo para descubrir dónde está liberando objetos . Esto y estos son dos buenos lugares para comenzar.

Otros consejos

Más importante que la opción de liberación automática o liberación manual es la frecuencia con la que asigna y dealloc sus NSAutoreleasePool s. Como la mayoría de los frameworks de Cocoa usan autorelease generosamente, debe tener una estrategia de drenaje de grupo adecuada. Una vez que eso esté en su lugar, la elección de liberar o autorelease se convierte en un problema mucho menor.

Dicho esto, las únicas áreas de las que debe preocuparse son los bucles estrechos: asigne y libere un NSAutoreleasePool cada pocas iteraciones para obtener mejores resultados; y cuando haya generado otro NSThread que no tiene Runloop, cree un grupo y drene de vez en cuando queda inactivo. Dado que la mayoría de las aplicaciones solo asignan una pequeña cantidad de datos por evento, la estrategia de UIKit de asignar el grupo antes de que se envíe el evento y liberarlo después de que el envío regrese funciona muy bien.

Si cree que no sabe cómo usar la liberación automática, consulte CS193p FALL 2010 en iTunes U - > Conferencia número 4.

Te enseña todo sobre la administración de la memoria y otras cosas (si te saltas los primeros 10 minutos más o menos)

Por razones de rendimiento de iPhone, Apple sugiere que, siempre que sea posible, no debe usar objetos lanzados automáticamente. En su lugar, suelte explícitamente sus objetos cuando haya terminado con ellos.

El uso de agrupaciones de liberación automática significa que puede estar dejando algo de memoria sin usar por ahí. Dado que el iPhone tiene menos memoria, puede mejorar el rendimiento si libera memoria innecesaria lo antes posible, en lugar de dejar que tome recursos mientras espera una liberación automática.

Cuando liberas automáticamente, básicamente estás diciendo: "No necesito esto por más tiempo, pero cualquier otra persona es libre de recogerlo (antes de que se agote el grupo de liberación automática)". Cuando explícitamente reenvía un objeto, está diciendo: "No necesito esto por más tiempo y, a menos que alguien más ya haya dicho lo contrario (adquirido), debe desasignarse de inmediato".

En consecuencia, la liberación automática no suele ser una cosa incorrecta. Se requiere cuando desea devolver objetos al remitente de un mensaje sin requerir que el remitente se encargue de liberar el objeto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top