¿Cuál es la diferencia entre el recuento automático de referencias de Objective-C y la recolección de basura?

Con el nuevo conteo automático de referencias (ARC) introducido en Xcode 4.2, ya no es necesario administrar manualmente retener / liberar en Objective-C.

Esto parece similar a la recolección de basura, como se hace en Objective-C en la Mac y en otros idiomas. ¿En qué se diferencia ARC de la recolección de basura?

Como describo en mi respuesta aquí , ARC puede proporcionar lo mejor de la administración manual de la memoria y la recolección de elementos no utilizados. En su mayoría, elimina la necesidad de que un desarrollador rastree retenciones manuales, lanzamientos y autorreleases en objetos Objective-C, pero evita la necesidad de un proceso de recolector de basura que puede consumir recursos limitados en un dispositivo móvil y ocasionar tartamudeos ocasionales en una aplicación en ejecución .

ARC inserta las actualizaciones y los retiros apropiados necesarios para el recuento de referencias en tiempo de comstackción, mediante la aplicación de las reglas que todos los desarrolladores de Objective-C han tenido que usar a lo largo de los años. Esto libera al desarrollador de tener que administrar esto por sí mismo. Debido a que las operaciones de retención y publicación se insertan en tiempo de comstackción, no se necesita un proceso de recostackción para barrer continuamente la memoria y eliminar objetos sin referencia.

Una pequeña ventaja que tiene el rastreo de recolección de basura sobre ARC es que ARC no se ocupará de retener los ciclos para usted , donde la recolección de basura puede rastrearlos.

Una gran lectura sobre el tema proviene de este hilo en la lista de correo de Objective-C de Apple , donde Chris Lattner dice lo siguiente:

La principal ventaja de GC sobre ARC es que recoge ciclos de retención. Una ventaja secundaria es que las asignaciones “retenidas” son “atómicas” porque son una tienda simple. ARC tiene varias grandes ventajas sobre el GC de libauto:

  1. Tiene una recuperación determinística de objetos (cuando la última referencia fuerte al objeto desaparece) donde GC libera un objeto “algún tiempo después”. Esto define una clase de errores sutiles que pueden existir en aplicaciones de GC que no están expuestas porque el recostackdor no desencadena “en la ventana con errores”.
  2. La marca de agua alta generalmente es mucho más baja con ARC que con GC porque los objetos se lanzan antes.
  3. libauto proporciona un modelo de progtwigción frágil, debe tener cuidado de no perder barreras de escritura, etc.
  4. no todos los marcos del sistema están limpios de GC, y los marcos ocasionalmente retroceden a medida que evolucionan.
  5. ARC no sufre de raíces falsas. libauto escanea conservativamente la stack, lo que significa que los enteros que parecen punteros pueden enraizar gráficos de objetos.
  6. ARC no tiene nada que se active y detenga su aplicación, lo que causa tartamudeos en la interfaz de usuario. libauto es bastante avanzado en lo que respecta a las implementaciones de GC, ya que no detiene inmediatamente cada subproceso, pero normalmente termina deteniendo todos los subprocesos de la interfaz de usuario.

Actualmente estoy migrando tanto mis proyectos administrados manualmente de memoria, como aquellos que usan la recolección de basura Objective-C, a ARC. Después de usar la recolección de basura en un par de aplicaciones Mac desde hace un tiempo, veo algunas ventajas significativas al mover estos proyectos a ARC.

ARC se basa en objetos “referenciados” en tiempo de comstackción que lo hacen eficiente en entornos de modo de baja potencia (dispositivos móviles).

GC se basa en objetos “alcanzables” basados ​​en el tiempo de ejecución que lo hacen eficiente en un entorno de subprocesos múltiples.

Operación

ARC inyecta un código en el ejecutable para que se ejecute “automáticamente” en los objetos no utilizados, dependiendo de su recuento de referencias.

GC funciona en tiempo de ejecución ya que detectará los gráficos de objetos no utilizados (eliminará los ciclos de retención) y los eliminará en intervalos de tiempo indeterminados

Ventajas del conteo automático de referencias

  • Destrucción determinística en tiempo real de los objetos a medida que no se utilizan.
  • Sin procesamiento en segundo plano.

Ventajas de la recolección de basura

  • GC puede limpiar gráficos de objetos completos, incluidos los ciclos de retención.
  • El GC continúa en segundo plano, por lo que se realiza menos trabajo de administración de la memoria como parte del flujo de aplicaciones normal.

Desventajas del recuento automático de referencias

  • ARC no puede manejar los ciclos de retención automáticamente.

Desventajas de la recolección de basura

  • Debido a que GC ocurre en segundo plano, el marco de tiempo exacto para las liberaciones de objetos no está determinado.
  • Cuando ocurre un GC, otros subprocesos de la aplicación se pueden poner temporalmente en espera.

¿En qué se diferencia ARC de la recolección de basura?

ARC es una forma de recolección de basura.

Probablemente se refiera a “¿cuál es la diferencia entre ARC y la recolección de basura rastreada (como JVM y .NET)?”. Las principales diferencias son que ARC es más lento y pierde ciclos. Es por eso que JVM y .NET usan colectores de basura. Para obtener más información, lea ¿Cómo se puede comparar el recuento de referencias y la recolección de elementos no utilizados? .

la respuesta corta y dulce es la siguiente:

GC de Java es Runtime, mientras que ARC es tiempo de comstackción.

GC hace referencia a los objetos en tiempo de ejecución y comprueba las dependencias del tiempo de ejecución del objeto. Mientras ARC anexa la liberación, retiene, libera las llamadas en tiempo de comstackción.