El conteo automático de referencias ( ARC ) es una función de administración de memoria del compilador Clang que proporciona 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 contador de referencias en tiempo de ejecución, marcando para su desasignación aquellos objetos cuando el número de referencias a ellos llega a cero.retainrelease
ARC se diferencia de la recolección de basura por rastreo en que no hay un proceso en segundo plano que libere los objetos de forma asíncrona en tiempo de ejecución. [ 3 ] A diferencia de la recolección de basura por rastreo, ARC no maneja automáticamente los ciclos de referencia . Esto significa que mientras existan referencias "fuertes" a un objeto, este no se liberará. Por consiguiente, las referencias cruzadas fuertes pueden crear interbloqueos y fugas de memoria . Es responsabilidad 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 e iOS 4 , con soporte completo en Mac OS X Lion e iOS 5. [ 6 ] La recolección de basura se declaró obsoleta en OS X Mountain Lion , en favor de ARC, y se eliminó de la biblioteca de tiempo de ejecución de Objective-C en macOS Sierra . [ 7 ] [ 8 ]
Objetivo-C
El compilador aplica las siguientes reglas cuando ARC está activado:
retain,release,retainCount,autoreleaseodeallocno se pueden enviar a los objetos. En su lugar, el compilador inserta estos mensajes automáticamente en tiempo de compilación, incluso[super dealloc]cuandodeallocse sobrescribe. [ 9 ]// Sin ARC - ( void ) dealloc { [[ NSNotificationCenter defaultCenter ] removeObserver : self ]; [ super dealloc ]; }// Con ARC - ( void ) dealloc { [[ NSNotificationCenter defaultCenter ] removeObserver : self ]; // [super dealloc] se llama automáticamente }
- Los programas no pueden realizar conversiones directas entre
idyvoid *. [ 9 ] Esto incluye la conversión entre objetos Foundation y objetos Core Foundation. Los programas deben usar conversiones especiales, o llamadas a funciones especiales, para indicar al compilador más información sobre el ciclo de vida de un objeto.// Sin ARC - ( NSString * ) giveMeAString { CFStringRef myString = [ self someMethodThatCreatesACFString ]; NSString * newString = ( NSString * ) myString ; return [ newString autorelease ]; }// Con ARC - ( NSString * ) giveMeAString { CFStringRef myString = [ self someMethodThatCreatesACFString ]; // el contador de retención es 1 NSString * newString = ( __bridge_transfer NSString * ) myString ; // la propiedad ahora se ha transferido a ARC return newString ; }
- Un grupo de liberación automática se puede usar para asignar objetos temporalmente y retenerlos en memoria hasta que el grupo se vacíe. Sin ARC,
NSAutoreleasePoolse puede crear un objeto para este propósito. ARC usa@autoreleasepoolbloques en su lugar, que encapsulan la asignación de los objetos temporales y los liberan cuando se llega al final del bloque. [ 9 ]// Sin ARC - ( void ) loopThroughArray: ( NSArray * ) array { for ( id object in array ) { NSAutoreleasePool * pool = [[ NSAutoreleasePool alloc ] init ]; // Crea muchos objetos temporales [ pool drain ]; } }// Con ARC - ( void ) loopThroughArray: ( NSArray * ) array { for ( id object in array ) { @autoreleasepool { // Crea muchos objetos temporales } } }
- Los programas no pueden llamar a las funciones
NSAllocateObjectyNSDeallocateObject[ 9 ] - Los programas no pueden usar punteros de objetos en estructuras C (
structs) [ 9 ] - Los programas no pueden usar zonas de memoria (
NSZone) [ 9 ] - Para cooperar correctamente con código que no sea ARC, los programas no deben usar ningún método o propiedad declarada (a menos que elijan explícitamente un getter diferente) que comience con
new. [ 9 ]
declaraciones de propiedad
ARC introduce algunos atributos nuevos para la declaración de propiedades, algunos de los cuales reemplazan a los atributos antiguos.
- ↑ ARCLite es ARC pero sin poner a cero las referencias débiles (se usa cuando se implementa en un entorno operativo menos capaz que el que requiere ARC).
Poner a cero las referencias débiles
La inicialización a cero de las referencias débiles es una característica de Objective-C ARC que borra automáticamente (establece a nil) las variables locales, las variables de instancia y las propiedades declaradas de referencias débiles justo antes de que el objeto al que apunta comience a liberarse. Esto garantiza que el puntero apunte a un objeto válido o a nil, y evita los punteros colgantes . Antes de la introducción de esta característica, las "referencias débiles" se referían a referencias que no se conservaban, pero que no se establecían a nil nilcuando el objeto al que apuntaban se liberaba (equivalente a unsafe_unretaineden ARC), lo que podía provocar un puntero colgante. El programador normalmente tenía que asegurarse de que todas las posibles referencias débiles a un objeto se establecieran a nil manualmente cuando se liberaba. La inicialización a cero de las referencias débiles elimina la necesidad de hacer esto.
La puesta a cero de referencias débiles se indica mediante el uso del atributo de propiedad declaradoweak o mediante el uso del atributo de variable __weak.
La inicialización a cero de referencias débiles solo está disponible en Mac OS X Lion (10.7) o posterior e iOS 5 o posterior, porque requiere soporte adicional del entorno de ejecución de 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 mencionadas anteriormente no puede usar la inicialización a cero de referencias débiles y, por lo tanto, debe usar unsafe_unretainedreferencias débiles. Existe una biblioteca de terceros llamada PLWeakCompatibility.Esto permite utilizar referencias débiles con anulación de ceros incluso en estas versiones antiguas del sistema operativo.
Convertir a
Xcode 4.2 o posterior proporciona una forma de convertir código a ARC. [ 10 ] A partir de Xcode 4.5, se encuentra seleccionando Editar > Refactorizar > Convertir a Objective-C ARC... Aunque Xcode convertirá automáticamente la mayor parte del código, es posible que algunos códigos deban convertirse manualmente. Xcode informará al desarrollador cuando surjan casos de uso más complejos, como cuando una variable se declara dentro de un grupo de autorelease y se usa fuera de él o cuando dos objetos necesitan ser puenteados sin pagar con conversiones especiales.
Rápido
En Swift, las referencias a objetos son fuertes, a menos que se declaren weakcomo nulas unowned. Swift requiere el manejo explícito de nil con el tipo Optional: un tipo de valor que puede tener un valor o ser nil. Un tipo Optional debe manejarse "desenvolviéndolo" con una instrucción condicional , lo que permite el uso seguro del valor, si está presente. Por el contrario, cualquier tipo que no sea Optional siempre tendrá un valor y no puede ser nil.
var myString : String // Solo puede ser una cadena var myOtherString : String ? // Puede ser una cadena o nilif let myString = myOtherString { // Desempaquetar el Optional print ( myString ) // Imprimir la cadena, si está presente }En consecuencia, una referencia fuerte a un objeto puede ser de tipo Optional o no Optional (la opcionalidad y la fuerza de la referencia son conceptos diferentes, aunque relacionados). Una referencia débil siempre es de tipo Optional, ya que el objeto puede ser desasignado y la referencia se establece automáticamente en nil. Las referencias sin propietario son como las referencias débiles, pero ARC no las establece automáticamente en nil. Pueden ser no Optional u Optional. 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 la instancia referenciada haya sido desasignada dará como resultado un error en tiempo de ejecución. [ 11 ]
var strongReference : MyClass // Referencia fuerte no opcional, no puede ser nil var strongOptionalReference : MyClass ? // Referencia fuerte opcional, puede ser nil (manualmente) weak var weakReference : MyClass ? // Referencia débil, siempre opcional, puede ser nil (automáticamente o manualmente) unowned var unownedReference : MyClass // Referencia no opcional no propiedad, no puede ser nilSwift también se diferencia de Objective-C en su uso y fomento de los tipos de valor en lugar de los 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 al pasarlos, se desasignan automáticamente cuando el programa sale del ámbito que los contiene. [ 11 ] [ 12 ]
Véase también
Referencias
- ↑ Siracusa, John (20 de julio de 2011). "Mac OS X 10.7 Lion: la reseña de Ars Technica" . Ars Technica . Ars Technica. En la sección "Conteo automático de referencias" . Recuperado el 17 de noviembre de 2016 .
- ↑ Kochan , Stephen G. (2011). Programación en Objective-C (4.ª ed.). Boston, Mass.: Addison-Wesley. pp. 408. ISBN 978-0321811905.
- ↑ Hoffman, Kevin (2012). Sams aprende a desarrollar aplicaciones para Mac OS X Lion en 24 horas . Indianápolis, Indiana: Sams. pp . 73. ISBN 9780672335815.
- ↑ "General" . Conteo automático de referencias . LLVM.org . Consultado el 15 de agosto de 2012 .
- ↑ "Índice de disponibilidad de características de Objective-C" . Apple, Inc. Consultado el 14 de octubre de 2013 .
- ↑ Sakamoto, Kazuki (2012). Pro Multithreading and Memory Management for iOS and OS X with ARC, Grand Central Dispatch and Blocks . Apress. pp. xii. ISBN 978-1430241164.
- ↑ Siracusa, John (25 de julio de 2012). "OS X 10.8 Mountain Lion: la reseña de Ars Technica" . Ars Technica . En la sección "Mejoras de Objective-C" . Consultado el 17 de noviembre de 2016 .
- ↑ "Notas de la versión de Xcode 8" . Apple Developer . 27 de octubre de 2016. Archivado del original el 19 de marzo de 2017. Consultado el 19 de marzo de 2017 .
- 1 2 3 4 5 6 7 8 "Transición a las notas de la versión de ARC" . Recuperado el 14 de septiembre de 2012 .
- ↑ "Novedades de Xcode 4.2: Conteo automático de referencias" . Apple Inc. Archivado del original el 20 de agosto de 2012. Consultado el 3 de octubre de 2012 .
- 1 2 "Conteo automático de referencias: el lenguaje de programación Swift (Swift 5.7)" . docs.swift.org . Consultado el 5 de noviembre de 2022 .
- ↑ "Tipos de valor y de referencia" . Apple Developer . 15 de agosto de 2014. Consultado el 17 de noviembre de 2016 .
Enlaces externos
- Transición a ARC: Biblioteca para desarrolladores de iOS
- "Conteo automático de referencias" en el lenguaje de programación Swift
- Objetivo-C
- Gestión de la memoria