8

Recientemente comencé a codificar en Objective-C para dispositivos iOS 5. Mi nueva MacBook está cargada con Xcode 4.2 y los últimos SDK de iOS Mac &. Hasta ahora ha sido una experiencia divertida, pero hay un problema que veo con el estado actual de la documentación y los libros disponibles.Como un nuevo desarrollador de Objective-C, ¿qué problemas relacionados con la memoria debo tener en cuenta al usar ARC?

Específicamente, la mayoría de los libros (que aún deben actualizarse) siempre hacen referencia a cómo y cuándo administrar su memoria. Esto es genial, sin embargo, el SDK/compilador actual incluye el recuento automático de referencias y, como lo dejo activado para mis proyectos, no tengo ni idea de qué debo supervisar y administrar personalmente.

Vengo de un fondo C#. La gestión de la memoria en C# (técnicamente, .NET) está totalmente gestionada por el recolector de elementos no utilizados. Entiendo que ARC es en realidad una función de compilación que agrega automáticamente el código de la placa de caldera a donde pertenece. Además, mis intentos de tratar de descubrir dónde debo administrar mi propia liberación de objetos no han causado más que errores en el compilador porque ARC quiere encargarse de eso.

Todavía tengo que encontrar un caso donde he necesitado para administrar mis objetos. Me estoy volviendo "perezoso" porque no sé qué controlar y liberarme y soy completamente ajeno a cómo este comportamiento podría afectar el rendimiento de mi aplicación.

En términos de usuario nuevo, ¿qué "errores" debería tener en cuenta al usar ARC en mis proyectos de iOS? He leído algunas preguntas sobre la administración de memoria y ARC por aquí, pero para ser sincero, no son amigables con el nuevo desarrollador de iOS. ¿Podría alguien proporcionar una lista de puntos clave razonable que explique qué problemas y cuestiones hay que tener en cuenta, así como una guía imparcial sobre cuándo es necesaria la autogestión de la memoria?

+2

Si es nuevo, use ARC. Para la aplicación promedio, no hay problemas de rendimiento. Si su aplicación usa mucha memoria (imágenes muy grandes, muchos archivos de sonido, etc.), tendrá que lidiar con eso, no con ARC, sino con la cantidad máxima de memoria que puede usar. – nycynik

+0

Aún puede crear ciclos de referencia –

+2

No estoy de acuerdo con el motivo de cierre "no constructivo" aquí. Esta es una pregunta específica con una respuesta objetiva, y actúa como una contraparte de la más técnica [¿Qué tipo de fugas hace el recuento de referencias automáticas de Objective-C (en Xcode 4.2) para prevenir/minimizar?] (Http: // stackoverflow. com/questions/6260256/what-kind-of-leaks-does-objective-cs-automatic-reference-count-in-xcode-4-2). Esto no solicita opiniones ni encuestas para una lista abierta de material que no puede contenerse en una respuesta. –

Respuesta

13
  • Referencias circulares. Cuando los objetos son codependientes, tendrán fugas. Deberá marcar algunas referencias como débiles e Instrumentos puede ayudarlo a localizar estas referencias. Estas filtraciones ni siquiera aparecerán como fugas porque tienen fuertes referencias entre sí.

  • Crea reservas automáticas @autorelease para mantener los tamaños del conjunto de autorreleases donde creas muchos objetos liberados automáticamente (directa o indirectamente). Específicamente, su programa y los programas de los que depende serán autorelease muchos objetos (ARC u otros). Un objeto lanzado automáticamente es uno que se lanzará "en el futuro". Cada programa de Cocoa espera que exista un pool de autorrelease en cada hilo. Esta es la razón por la que crea un grupo nuevo cuando crea un nuevo hilo, y por qué crea uno en main. Las piscinas funcionan como una pila; puede empujar y hacer estallar piscinas. Cuando se destruye un grupo, envía su mensaje diferido release a cada objeto que contiene. Esto significa que los bucles realmente grandes con muchas asignaciones temporales pueden dar como resultado muchos objetos a los que el grupo hace referencia, y el conjunto puede crecer mucho. Por esta razón, drene los pools de administración directamente en algunos casos para minimizar el número de objetos que están esperando ser liberados y desasignados.

  • Use puenteo/fundición adecuado. A veces necesitarás administrar las vidas útiles de forma explícita. ARC maneja los casos obvios, pero existen casos complejos en los que tendrá que administrar vidas de forma explícita.

  • Al usar malloc 'ed y new' ed asignaciones, así como tipos opacos en 'Core' API. ARC solo administra NSObject tipos. Aún necesita liberar explícitamente, eliminar y usar recuentos de ref correctamente para estas asignaciones, tipos y cuando interactúe con esas API.

  • Siempre siga las convenciones de nomenclatura NS-API, y avoid explicit memory management attributes where possible.

  • Obviamente necesitará MRC cuando compile fuentes sin ARC o GC. Esto es bastante común cuando se usan/trabajan con otras bibliotecas/cuerpos de códigos. Por supuesto, el compilador maneja las interacciones correctamente para que su programa ARC no tenga fugas.

  • ARC maneja más lo que necesitará si utiliza nombres adecuados y estilo escrito, pero habrá algunos otros casos de esquina. Afortunadamente, aún puedes ejecutar Leaks and Zombies para localizar estos problemas si no los realizas durante el desarrollo.

+2

Sugeriría hablar de objetos "temporales" en lugar de objetos "autoreleasados", ya que alguien que vaya directamente a ARC probablemente no tenga idea de lo que es un objeto liberado automáticamente. Técnicamente, "temporal"! = "Liberado automáticamente", pero en la mayoría de los casos, el consejo será bueno de cualquier manera. –

+0

@BJHomer ok, gracias. Intenté explicar los grupos de autorrelease en un párrafo. gracias por señalar eso. – justin

+0

Gracias por publicar esto. Este es un excelente comienzo y muy bien puedo imprimir esto para tenerlo a mano. – RLH

Cuestiones relacionadas