www vancouver referencias pagina online internet insertar harvard generador for citethisforme citas citar bibliografia apa ios objective-c macos memory-leaks automatic-ref-counting

ios - vancouver - referencias apa harvard



¿Qué tipo de fugas no evita o minimiza el recuento automático de referencias en Objective-C? (5)

ARC no lo ayudará con la memoria que no es de ObjC, por ejemplo, si malloc() algo, aún necesita free() .

ARC puede ser engañado por performSelector: si el compilador no puede averiguar qué es el selector (el compilador generará una advertencia al respecto).

ARC también generará código siguiendo las convenciones de nomenclatura de ObjC, por lo tanto, si combina el código ARC y MRC, puede obtener resultados sorprendentes si el código MRC no hace lo que el compilador cree que prometen los nombres.

En las plataformas Mac e iOS, las pérdidas de memoria a menudo son causadas por punteros no publicados. Tradicionalmente, siempre ha sido de suma importancia verificar sus asignaciones, copias y retenciones para asegurarse de que cada una tenga el mensaje de liberación correspondiente.

La cadena de herramientas que viene con Xcode 4.2 introduce el recuento automático de referencias (ARC) con la última versión del compilador LLVM , que elimina completamente este problema al hacer que el compilador se encargue de la gestión de la memoria. Eso es bastante bueno, y reduce mucho tiempo de desarrollo mundano e innecesario y previene muchas fugas de memoria descuidadas que son fáciles de solucionar con un equilibrio adecuado de retención / liberación. Incluso los grupos de autorelease deben administrarse de manera diferente cuando habilita ARC para sus aplicaciones Mac e iOS (ya que no debe asignar sus propios NSAutoreleasePool s).

Pero, ¿qué otras fugas de memoria no impiden que todavía tenga que tener cuidado?

Como beneficio adicional, ¿cuáles son las diferencias entre ARC en Mac OS X e iOS y la recolección de basura en Mac OS X?


ARC tampoco administrará los tipos de CoreFoundation. Puede " CFBridgingRelease() " (usando CFBridgingRelease() ) pero solo si lo va a usar como un objeto Objective-C / Cocoa. Tenga en cuenta que CFBridgingRelease simplemente reduce la cuenta de retención de CoreFoundation en 1 y la mueve al ARC de Objective-C.


El problema principal relacionado con la memoria que aún deberá conocer es la retención de ciclos. Esto ocurre cuando un objeto tiene un puntero fuerte a otro, pero el objeto de destino tiene un puntero fuerte al original. Incluso cuando todas las demás referencias a estos objetos se eliminan, se mantendrán pegadas entre sí y no se liberarán. Esto también puede suceder indirectamente, por una cadena de objetos que podría tener el último en la cadena que se refiere a un objeto anterior.

Es por esta razón que existen los calificadores de propiedad __unsafe_unretained y __weak . El primero no retendrá ningún objeto al que apunta, pero deja abierta la posibilidad de que ese objeto desaparezca y apunte a mala memoria, mientras que el segundo no retiene el objeto y se establece automáticamente en cero cuando su objetivo está desasignado. De los dos, generalmente se prefiere __weak en las plataformas que lo admiten.

Usaría estos calificadores para cosas como delegados, donde no desea que el objeto retenga su delegado y potencialmente lleve a un ciclo.

Otro par de problemas importantes relacionados con la memoria es el manejo de los objetos de Core Foundation y la memoria asignada utilizando malloc() para tipos como char* . ARC no administra estos tipos, solo objetos Objective-C, por lo que aún tendrá que tratarlos usted mismo. Los tipos de Core Foundation pueden ser particularmente complicados, porque a veces necesitan ser conectados a objetos Objective-C coincidentes, y viceversa. Esto significa que el control debe transferirse de un lado a otro desde ARC cuando se realiza un puente entre los tipos de CF y Objective-C. Se han agregado algunas palabras clave relacionadas con este puente, y Mike Ash tiene una gran descripción de varios casos de puente en su extenso artículo de ARC .

Además de esto, hay varios otros casos menos frecuentes, pero aún potencialmente problemáticos, en los que se detallan las especificaciones publicadas .

Gran parte del nuevo comportamiento, basado en mantener objetos alrededor mientras haya un puntero fuerte, es muy similar a la recolección de basura en la Mac. Sin embargo, los fundamentos técnicos son muy diferentes. En lugar de tener un proceso de recolección de basura que se ejecuta a intervalos regulares para limpiar los objetos que ya no se señalan, este estilo de gestión de memoria se basa en las rígidas reglas de retención / liberación que todos debemos obedecer en Objective-C.

ARC simplemente toma las tareas repetitivas de administración de memoria que hemos tenido que hacer durante años y las descarga al compilador para que nunca más tengamos que preocuparnos por ellas. De esta manera, no tiene los problemas de detención o los perfiles de memoria de diente de sierra experimentados en las plataformas de recolección de basura. He experimentado estos dos en mis aplicaciones de Mac recolectadas en la basura, y estoy ansioso por ver cómo se comportan bajo ARC.

Para más información sobre la recolección de basura en comparación con ARC, vea esta respuesta muy interesante de Chris Lattner en la lista de correo de Objective-C , donde enumera muchas ventajas de ARC sobre la recolección de basura de Objective-C 2.0. Me he topado con varios de los problemas de GC que describe.


Experimenté pérdidas de memoria en mi aplicación debido a los siguientes 4 problemas:

  1. No invalida NSTimers al descartar controladores de vista
  2. Olvidarse de eliminar cualquier observador de NSNotificationCenter al descartar el controlador de vista.
  3. Manteniendo fuertes referencias a sí mismo en bloques.
  4. Usando referencias fuertes a los delegados en las propiedades del controlador de vista

Por suerte, encontré la siguiente publicación del blog y pude corregirla: http://www.reigndesign.com/blog/debugging-retain-cycles-in-objective-c-four-likely-culprits/


Xcode 9 proporciona una gran herramienta para encontrar ese tipo de problemas. Se llama: " Debug Memory Graph ". Usándolo, puede encontrar su objeto filtrado por tipo de clase y puede ver claramente quién tiene una fuerte referencia a él, liberándolo desde allí resuelve su problema. También se detecta ciclos de memoria.

Ver más información sobre cómo usarlo.