stringtranslate.com

Recuento automático de referencias

El conteo automático de referencias ( ARC ) es una función de gestión de memoria del compilador Clang que proporciona un conteo automático de referencias para los lenguajes de programación Objective-C y Swift . En tiempo de compilación, inserta en el código objeto mensajes y [1] [2] que aumentan y disminuyen el conteo de referencias en tiempo de ejecución, marcando para la desasignación aquellos objetos cuando el número de referencias a ellos llega a cero. retainrelease

ARC se diferencia del seguimiento de la recolección de basura en que no hay un proceso en segundo plano que desasigne los objetos de forma asincrónica en tiempo de ejecución. [3] A diferencia del seguimiento de la recolección de basura, ARC no maneja los ciclos de referencia automáticamente. Esto significa que mientras haya referencias "fuertes" a un objeto, no se desasigne. Las referencias cruzadas fuertes pueden crear bloqueos y fugas de memoria . Depende del desarrollador romper los ciclos mediante el uso de referencias débiles . [4]

Apple Inc. implementa ARC en sus sistemas operativos, como macOS ( OS X ) e iOS . El soporte limitado (ARCLite) [5] ha estado disponible desde Mac OS X Snow Leopard y iOS 4 , con soporte completo a partir de Mac OS X Lion y iOS 5. [ 6] La recolección de basura se declaró obsoleta en OS X Mountain Lion , a favor de ARC, y se eliminó de la biblioteca de tiempo de ejecución Objective-C en macOS Sierra . [7] [8]

Objetivo-C

El compilador aplica las siguientes reglas cuando ARC está activado:

Declaraciones de propiedad

ARC introduce algunos nuevos atributos de declaración de propiedades, algunos de los cuales reemplazan los atributos antiguos.

  1. ^ ARCLite es ARC pero sin poner a cero las referencias débiles (se usa cuando se implementa en un entorno operativo con menos capacidad que la que requiere ARC).

Poner a cero las referencias débiles

Poner a cero las referencias débiles es una característica de Objective-C ARC que borra automáticamente (establece en nil) las variables locales de referencia débil, las variables de instancia y las propiedades declaradas inmediatamente antes de que el objeto al que se apunta comience a desasignarse. Esto garantiza que el puntero vaya a un objeto válido o nil, y evita punteros colgantes . Antes de la introducción de esta característica, las "referencias débiles" hacían referencia a referencias que no se retenían, pero que no se establecían en nilcuando se desasignaba el objeto al que apuntaban (equivalente a unsafe_unretaineden ARC), lo que posiblemente condujera a un puntero colgante. El programador normalmente tenía que asegurarse de que todas las posibles referencias débiles a un objeto se establecieran en nulo manualmente cuando se desasignaba. Poner a cero las referencias débiles evita la necesidad de hacer esto.

La puesta a cero de referencias débiles se indica mediante el uso del atributo de propiedad declarado weako mediante el uso del atributo de variable __weak.

La puesta a cero de referencias débiles solo está disponible en Mac OS X Lion (10.7) o posterior y iOS 5 o posterior, porque requiere soporte adicional del entorno de ejecución Objective-C. Sin embargo, algunas clases de OS X actualmente no admiten referencias débiles. [9] El código que usa ARC pero necesita admitir versiones del sistema operativo anteriores a las anteriores no puede usar la puesta a cero de referencias débiles y, por lo tanto, debe usar unsafe_unretainedreferencias débiles. Existe una biblioteca de terceros llamada PLWeakCompatibility [1] que permite usar la puesta a cero de referencias débiles incluso en estas versiones anteriores del sistema operativo.

Convirtiendo a

Xcode 4.2 o posterior proporciona una forma de convertir código a ARC. [10] A partir de Xcode 4.5, se encuentra eligiendo Editar > Refactorizar > Convertir a Objective-C ARC... Aunque Xcode convertirá automáticamente la mayor parte del código, es posible que parte del código deba convertirse manualmente. Xcode informará al desarrollador cuando surjan casos de uso más complejos, como cuando se declara una variable dentro de un grupo de liberación automática y se usa fuera de él o cuando dos objetos deben conectarse sin costo con conversiones especiales.

Rápido

En Swift, las referencias a objetos son fuertes, a menos que se declaren weako unowned. Swift requiere el manejo explícito de nil con el tipo Opcional: un tipo de valor que puede tener un valor o ser nulo. Un tipo Opcional debe manejarse "desenvolviéndolo" con una declaración condicional , lo que permite el uso seguro del valor, si está presente. Por el contrario, cualquier tipo que no sea Opcional siempre tendrá un valor y no puede ser nulo.

var  myString :  String  // Solo puede ser una cadena var  myOtherString :  String ?  // Puede ser una cadena o nulosi  deja que  myString  =  myOtherString  { // Desenrolle la  impresión opcional  ( myString ) // Imprima la cadena, si está presente } 

En consecuencia, una referencia fuerte a un objeto puede ser tanto de tipo opcional como no opcional (la opcionalidad y la fuerza de la referencia son conceptos diferentes, aunque relacionados). Una referencia débil siempre es de tipo opcional, ya que el objeto puede desasignarse y la referencia se establece automáticamente en nula. Las referencias sin propietario son como las referencias débiles, pero ARC no las establece en nula automáticamente. Pueden ser no opcionales u opcionales. Se espera que una referencia sin propietario siempre tenga un valor, por lo que acceder al valor de una referencia sin propietario después de que se haya desasignado la instancia referenciada dará como resultado un error de tiempo de ejecución. [11]

var  strongReference :  MyClass  // Referencia fuerte no opcional, no puede ser nula var  strongOptionalReference :  MyClass ?  // Referencia fuerte opcional, puede ser nula (manualmente) weak  var  weakReference :  MyClass ?  // Referencia débil, siempre opcional, puede ser nula (automática o manualmente) unowned  var  unownedReference :  MyClass  // Referencia no opcional sin propietario, no puede ser nula

Swift también se diferencia de Objective-C en su uso y fomento de tipos de valor en lugar de tipos de referencia . La mayoría de los tipos en la biblioteca estándar de Swift son tipos de valor y se copian por valor, mientras que las clases y los cierres son tipos de referencia y se pasan por referencia. Debido a que los tipos de valor se copian cuando se pasan, se desasignan automáticamente cuando el programa abandona el ámbito que los contiene. [11] [12]

Véase también

Referencias

  1. ^ Siracusa, John (20 de julio de 2011). «Mac OS X 10.7 Lion: la revisión de Ars Technica». Ars Technica . Ars Technica. En la sección «Recuento automático de referencias» . Consultado el 17 de noviembre de 2016 .
  2. ^ Kochan, Stephen G. (2011). Programación en Objective-C (4.ª ed.). Boston, Mass.: Addison-Wesley. pp. 408. ISBN 978-0321811905.
  3. ^ Hoffman, Kevin (2012). Sams: aprenda a desarrollar aplicaciones para Mac OS X Lion en 24 horas . Indianápolis, Indiana: Sams. pp. 73. ISBN 9780672335815.
  4. ^ "General". Recuento automático de referencias . LLVM.org . Consultado el 15 de agosto de 2012 .
  5. ^ "Índice de disponibilidad de funciones de Objective-C". Apple, Inc. Consultado el 14 de octubre de 2013 .
  6. ^ Sakamoto, Kazuki (2012). Gestión de memoria y subprocesamiento multiproceso profesional para iOS y OS X con ARC, Grand Central Dispatch y Blocks . Apress. págs. xii. ISBN 978-1430241164.
  7. ^ Siracusa, John (25 de julio de 2012). «OS X 10.8 Mountain Lion: la revisión de Ars Technica». Ars Technica . En la sección «Mejoras de Objective-C» . Consultado el 17 de noviembre de 2016 .
  8. ^ "Notas de la versión de Xcode 8". Apple Developer . 27 de octubre de 2016. Archivado desde el original el 19 de marzo de 2017 . Consultado el 19 de marzo de 2017 .
  9. ^ abcdefgh "Notas de la versión de transición a ARC" . Consultado el 14 de septiembre de 2012 .
  10. ^ "Novedades de Xcode 4.2: recuento automático de referencias". Archivado desde el original el 20 de agosto de 2012 . Consultado el 3 de octubre de 2012 .
  11. ^ ab "Recuento automático de referencias: el lenguaje de programación Swift (Swift 5.7)". docs.swift.org . Consultado el 5 de noviembre de 2022 .
  12. ^ "Tipos de valores y referencias". Apple Developer . 15 de agosto de 2014 . Consultado el 17 de noviembre de 2016 .

Enlaces externos