vancouver tutorial referencias online libros internet generador for ejemplos ejemplo citas bibliograficas bibliografia apa objective-c cocoa-touch garbage-collection automatic-ref-counting

objective-c - tutorial - referencias bibliograficas de internet



¿Cómo funciona el nuevo mecanismo de conteo automático de referencias? (5)

ARC es simplemente reproducir / retener / liberar (MRC) con el compilador pensando cuándo llamar a retener / liberar. Tenderá a tener un rendimiento más alto, un uso de memoria pico más bajo y un rendimiento más predecible que un sistema GC.

Por otro lado, algunos tipos de estructura de datos no son posibles con ARC (o MRC), mientras que GC puede manejarlos.

Como ejemplo, si tiene una clase denominada nodo, y el nodo tiene una NSArray de elementos secundarios y una única referencia a su elemento primario que "simplemente funciona" con GC. Con ARC (y el recuento manual de referencias también) tiene un problema. Cualquier nodo dado será referenciado desde sus hijos y también desde su padre.

Me gusta:

A -> [B1, B2, B3] B1 -> A, B2 -> A, B3 -> A

Todo está bien mientras usa A (por ejemplo, a través de una variable local).

Cuando haya terminado con él (y B1 / B2 / B3), un sistema GC eventualmente decidirá ver todo lo que pueda encontrar a partir de los registros de la pila y la CPU. Nunca encontrará A, B1, B2, B3, por lo que los finalizará y reciclará la memoria en otros objetos.

Cuando usa ARC o MRC, y termina con A, tiene un refcount de 3 (B1, B2 y B3 todos lo hacen referencia), y B1 / B2 / B3 tendrán un recuento de referencias de 1 (el NSArray de A contiene una referencia a cada). Así que todos esos objetos permanecen vivos, aunque nada pueda usarlos.

La solución común es decidir que una de esas referencias debe ser débil (no contribuir al recuento de referencias). Eso funcionará para algunos patrones de uso, por ejemplo, si hace referencia a B1 / B2 / B3 solo a través de A. Sin embargo, en otros patrones falla. Por ejemplo, si a veces se aferra a B1 y espera subir nuevamente a través del puntero principal y encuentra a A. Con una referencia débil si solo se aferra a B1, A puede evaporarse (y normalmente lo hará) y tomar B2, y B3 con eso.

A veces esto no es un problema, pero algunas formas muy útiles y naturales de trabajar con estructuras complejas de datos son muy difíciles de usar con ARC / MRC.

Así que ARC apunta al mismo tipo de problemas objetivos de GC. Sin embargo, ARC funciona en un conjunto más limitado de patrones de uso que GC, por lo que si tomara un lenguaje GC (como Java) e injertara algo como ARC en él, algunos programas no funcionarían más (o al menos generarían toneladas de memoria abandonada). , y puede causar serios problemas de intercambio o quedarse sin memoria o espacio de intercambio).

También puede decir que ARC le da una mayor prioridad al rendimiento (o quizás a la previsibilidad), mientras que GC le da una mayor prioridad a ser una solución genérica. Como resultado, GC tiene demandas de CPU / memoria menos predecibles y un rendimiento menor (normalmente) que ARC, pero puede manejar cualquier patrón de uso. ARC funcionará mucho mejor para muchos patrones de uso comunes, pero para algunos patrones de uso (¡válidos!) Caerá y morirá.

¿Puede alguien explicarme brevemente cómo funciona ARC? Sé que es diferente de la recolección de basura, pero me preguntaba exactamente cómo funcionaba.

Además, si ARC hace lo que hace GC sin obstaculizar el rendimiento, ¿por qué Java utiliza GC? ¿Por qué no usa ARC también?


Muy bien explicado por la documentación del desarrollador de Apple. Lea "Cómo funciona ARC"

Para asegurarse de que las instancias no desaparezcan mientras aún son necesarias, ARC rastrea cuántas propiedades, constantes y variables se están refiriendo actualmente a cada instancia de clase. ARC no desasignará una instancia mientras exista al menos una referencia activa a esa instancia.

Para asegurarse de que las instancias no desaparezcan mientras aún son necesarias, ARC rastrea cuántas propiedades, constantes y variables se están refiriendo actualmente a cada instancia de clase. ARC no desasignará una instancia mientras exista al menos una referencia activa a esa instancia.

Para saber Diff. entre recolección de basura y ARC: Lee this


Varía mucho de la recolección de basura. ¿Has visto las advertencias que te dicen que puedes estar filtrando objetos en diferentes líneas? Esas declaraciones incluso le indican en qué línea asignó el objeto. Esto ha sido un paso más allá y ahora puede insertar declaraciones de retain / release en las ubicaciones adecuadas, mejor que la mayoría de los programadores, casi el 100% del tiempo. En ocasiones, hay algunos casos extraños de objetos retenidos con los que necesitas ayudarlo.


mágico

Pero más específicamente, ARC funciona haciendo exactamente lo que haría con su código (con ciertas diferencias menores). ARC es una tecnología de tiempo de compilación, a diferencia de GC, que es tiempo de ejecución e impactará negativamente en su rendimiento. ARC rastreará las referencias a los objetos por usted y sintetizará los métodos de retener / liberar / autorelease según las reglas normales. Debido a esto, ARC también puede lanzar cosas tan pronto como ya no sean necesarias, en lugar de lanzarlas a un grupo de autorelease simplemente por convención.

Algunas otras mejoras incluyen la reducción a cero de las referencias débiles, la copia automática de bloques en el montón, las aceleraciones en general (6x para grupos de autorelease).

Una discusión más detallada sobre cómo funciona todo esto se encuentra en los http://clang.llvm.org/docs/AutomaticReferenceCounting.html en ARC.


Cada nuevo desarrollador que llega a Objective-C tiene que aprender las reglas rígidas de cuándo retener, liberar y liberar automáticamente objetos. Estas reglas incluso especifican convenciones de nomenclatura que implican la retención del recuento de objetos devueltos por los métodos. La administración de la memoria en Objective-C se convierte en algo natural una vez que se toma en serio estas reglas y las aplica de manera consistente, pero incluso los desarrolladores de Cocoa más experimentados se deslizan de vez en cuando.

Con el Clang Static Analyzer, los desarrolladores de LLVM se dieron cuenta de que estas reglas eran lo suficientemente confiables como para que pudieran construir una herramienta para señalar fugas de memoria y relanzamientos dentro de las rutas que toma su código.

http://clang.llvm.org/docs/AutomaticReferenceCounting.html (ARC) es el siguiente paso lógico. Si el compilador puede reconocer dónde debe retener y liberar objetos, ¿por qué no inserta ese código por usted? Las tareas rígidas y repetitivas son excelentes para los compiladores y sus hermanos. Los humanos olvidan las cosas y cometen errores, pero las computadoras son mucho más consistentes.

Sin embargo, esto no lo libera por completo de preocuparse por la administración de la memoria en estas plataformas. Describo el problema principal a tener en cuenta (retener ciclos) en mi respuesta here , que puede requerir un poco de reflexión por parte de usted para marcar los punteros débiles. Sin embargo, eso es menor en comparación con lo que estás ganando en ARC.

Cuando se compara con la gestión de memoria manual y la recolección de basura, ARC le ofrece lo mejor de ambos mundos al eliminar la necesidad de escribir código de retención / liberación, sin tener los perfiles de memoria de diente de sierra y de detención en un entorno de recolección de basura. Sobre las únicas ventajas que tiene la recolección de basura sobre esto está su capacidad para lidiar con los ciclos de retención y el hecho de que las asignaciones de propiedades atómicas son baratas (como se explica here ). Sé que estoy reemplazando todos mis códigos existentes de Mac GC con implementaciones ARC.

En cuanto a si esto podría extenderse a otros idiomas, parece orientado en torno al sistema de conteo de referencias en Objective-C. Puede ser difícil aplicar esto a Java u otros lenguajes, pero no sé lo suficiente sobre los detalles del compilador de bajo nivel para hacer una declaración definitiva allí. Dado que Apple es el que impulsa este esfuerzo en LLVM, Objective-C será lo primero, a menos que otra parte comprometa recursos significativos propios para esto.

La revelación de estos sorprendidos desarrolladores en WWDC, por lo que la gente no era consciente de que algo como esto podría hacerse. Con el tiempo, puede aparecer en otras plataformas, pero por ahora es exclusivo de LLVM y Objective-C.