ios memory memory-management ios5 automatic-ref-counting

ios - ARC, ¿vale la pena o no?



memory memory-management (7)

Cuando me mudé a Objective C (iOS) desde C ++ (y poco Java), tuve dificultades para comprender la administración de memoria en iOS. Pero ahora todo esto parece natural y sé retener, liberar automáticamente, copiar y lanzar cosas. Después de leer sobre ARC, me pregunto si hay más beneficios de usar ARC o simplemente que no tiene que preocuparse por la administración de la memoria. Antes de mudarme a ARC, quería saber cómo se está moviendo el valor a ARC.

  1. XCode tiene el menú "Convertir a Objective C ARC". ¿La conversión es así de simple (nada de qué preocuparse)?
  2. ¿Me ayuda a reducir la huella de memoria de mi aplicación, pérdidas de memoria, etc. (de alguna manera?)
  3. ¿Tiene mucho impacto en las pruebas de mis aplicaciones?
  4. ¿Cuáles son las ventajas no obvias?
  5. ¿Alguna desventaja de mudarse a ella?

  1. Si está utilizando Core Foundation o código que no es Objective-C, no es tan simple como tener que pasar su código manualmente y asegurarse de que todos los moldes entre Objective-C y Core Foundation estén puenteados (si tiene moldes). También tendrá que administrar la memoria para código que no sea Objective-C.

  2. Se supone que esencialmente se encarga de todas las filtraciones de memoria, ya que automatiza la retención, liberación, copia, etc. Hasta ahora, nunca he tenido una fuga de Objective-C desde que cambié a ARC.

  3. No. El edificio puede tardar un poco más, ya que tiene que pasar por todo tu código e insertar todo el código de retención y liberación.

  4. No estoy seguro de si hay alguno. Al final, todo ARC es, es un automatizador.

  5. Tendrás que aprender acerca de los moldes en puente así como tampoco puedes construir para algo inferior a iOS 4.

Al final, definitivamente vale la pena. Al principio era escéptico, pero después de ver el video de la WWDC donde explican cómo funciona, me gustaba cada vez más.


¿Has leído la documentación de Apple sobre ARC ? Responde muchas de las preguntas que hace.

Según mi experiencia, esto es lo que pienso:

  1. Sí, es simple. Sin embargo, definitivamente necesita probar su aplicación después de la conversión.
  2. Puede ayudar a reducir el uso de la memoria de la aplicación y las fugas, pero no está garantizado para hacer eso.
  3. Sí. Querrá probar después de convertir a ARC.
  4. No tiene que perder tanto tiempo pensando y rastreando fugas. Puede gastar más tiempo y energía en el código real de su aplicación, en lugar de preocuparse por retener / liberar. Incluso si conservar / liberar código es natural y fácil para usted, no es infalible y ocasionalmente se olvidará de lanzar algo. ARC no se olvida.
  5. Si está soportando iOS 4, tendrá que manejar referencias débiles, ya que ARC no es compatible con las de iOS 4.

3) Deberías volver a probar tus aplicaciones, pero en mi experiencia simplemente funcionará. ¡Mira todas las advertencias del compilador con mucho cuidado!

4) Ventajas no obvias: es realmente más rápido codificar cuando no tiene que pensar en la gestión de la memoria. Tal vez eso es obvio, pero la cantidad que ayuda aún me sorprendió.

5) Desventajas: Realmente la única desventaja es tener que desactivar ARC para algunas bibliotecas de terceros.

ARC ha sido tan útil que simplemente no codificaré sin él más. No hay razón para tener que lidiar con todo eso más y funciona lo suficientemente bien en la práctica.


Vea el video WWDC en ARC: https://developer.apple.com/videos/wwdc/2011/?id=323

La postura oficial de Apple en ese video es que todas las aplicaciones que pueden usar ARC deberían usar ARC. El video explica por qué, y es una excelente visión general de la tecnología, así que no voy a repetir todo aquí.


Descubrí: ARC hace tu código MUCHO más rápido. En Apples WWDC video, dicen, que se guardan un par de ciclos de CPU para cada retención de NSObject y métodos de liberación. Esto se debe a que ya no es necesario verificarlo en el tiempo de ejecución (ahora está tercerizado al compilador). Se trata de 6 ciclos de CPU para cada retención. Si usa un bucle que crea muchos objetos, entonces realmente puede sentir la diferencia.

ARC no solo hace que el código sea más rápido, sino que USTED escribe menos código, lo que acelera su proceso de desarrollo dramáticamente. Y por último, pero no menos importante, no debe buscar las pérdidas de memoria en un 90% de su código. Si no usas muchas cosas de bajo nivel, que deben usar "__bridge cast", estás COMPLETAMENTE sin pérdidas de memoria.

Conclusión: si puedes hacerlo, ¡HAZLO!


Esto es lo que realmente necesita saber sobre ARC:

El compilador entiende Objective-C y Cocoa mejor que tú. No me refiero a esto como un insulto; lo entiende mejor que yo. Creo que se puede decir con seguridad que comprende las reglas mejor que todos, pero tal vez una docena de personas en todo el mundo. Y sabe trucos para usarlos en un grado que tú y yo no podemos repetir, incluso si lo entendimos tan bien como lo hace.

El resto son solo detalles:

  • Escribirás un código mucho menos aburrido. Código tan aburrido es fácil cometer errores.
  • Como proceso de tiempo de compilación y tiempo de ejecución combinados, tiene acceso a trucos que usted no tiene.
    • Trabajará mejor escribiendo código de administración de memoria que usted, incluso si escribe el código de administración de memoria perfecto teórico.
    • Reducirá el uso de la memoria de "pleamar" (algo) sin ningún esfuerzo de su parte.
    • Con la reducción a cero de las referencias débiles, es mucho más fácil evitar bloqueos causados ​​por punteros colgantes.
  • Si está iniciando una nueva aplicación, deje de pensar en ella y simplemente úsela.
  • Si tienes una aplicación existente:
    • Tendrá que volver a probarlo. Debes asegurarte de que no tienes referencias circulares.
    • Si tiene una aplicación existente que apunta a iOS antes de iOS 5, no se admiten las referencias débiles de puesta a cero. Deberías considerar seriamente requerir iOS 5.
    • Si tiene una aplicación existente que apunta a iOS antes de iOS 4, no puede usarla en absoluto. ¿Qué estás pensando, apoyando esa mierda tan vieja?!?
  • En la última versión de Xcode, no estaba completamente libre de errores. Probablemente todavía no lo es. Pero vale la pena usarlo.

Aquí está mi opinión específica sobre ARC:

1) XCode tiene el menú "Convertir a Objective C ARC". ¿La conversión es así de simple (nada de qué preocuparse)?

Es sencillo. Funciona. Úselo. Sin embargo, como señala Kevin Low, tendrá que revisar y corregir los bits donde usa los objetos de Core Foundation. __bridge_transfer embargo, eso solo requerirá un __bridge saludable de __bridge o __bridge_transfer .

2) ¿Me ayuda a reducir la huella de memoria de mi aplicación, pérdidas de memoria, etc. (de alguna manera?)

No, realmente no. OK, más o menos. Ayudará a reducir las pérdidas de memoria donde haya codificado incorrectamente previamente. No reducirá la huella de memoria.

3) ¿Tiene mucho impacto en las pruebas de mis aplicaciones?

Ninguno en absoluto.

4) ¿Cuáles son las ventajas no obvias?

El futuro. Habrá más para obtener la bonificación que le da al compilador que toma un conocimiento complejo de cómo son los objetos contados. Por ejemplo, ARC proporciona ya la encantadora optimización objc_retainAutoreleasedReturnValue , que es muy agradable.

5) ¿Alguna desventaja que se mueva hacia ella?

Ninguno en absoluto.

Por favor toma mi palabra y comienza a usar ARC. No hay ninguna razón (IMO) para que no, por lo tanto, las ventajas definitivamente superan las desventajas.

Para ver en profundidad cómo funciona ARC y quizás ayudar a convencerlo de que es bueno, eche un vistazo a las publicaciones de mi blog tituladas "Una mirada en el capó de ARC": aquí , aquí , aquí y aquí .