memory-management - basics - swift variables
¿Cuál es la diferencia en Swift entre ''sin dueño(seguro)'' y ''sin dueño(inseguro)''? (3)
Por lo que entiendo, aunque no puedo encontrar una fuente definitiva de Apple, unowned
puede dividirse en dos sabores, safe
e unsafe
.
Un unowned
unowned(safe)
unowned
posee unowned(safe)
: es una referencia especialmente envuelta que generará una excepción cuando se haga referencia a una instancia desasignada.
El caso especial unowned(unsafe)
posee unowned(unsafe)
: es el equivalente Swift de @property (assign)
o __unsafe_unretained
del Objective C''s. No debe usarse en un programa Swift, porque su propósito es crear un puente con el código escrito en el Objetivo C.
Por lo tanto, verá unowned(unsafe)
al mirar el contenedor de importación para las clases de Cocoa, pero no lo use a menos que sea necesario, y sabrá cuando sea necesario.
Actualizar
__unsafe_unretained
es un simple puntero. No sabrá cuándo se desasignó la instancia a la que se apunta, por lo que cuando se desreferencia, la memoria subyacente podría ser basura.
Si tiene un defecto donde se está utilizando una variable __unsafe_unretenida __unsafe_unretained
, verá un comportamiento errático. A veces, la ubicación de la memoria es lo suficientemente buena para que el código se ejecute, a veces se ha sobrescrito parcialmente, por lo que tendrá bloqueos muy extraños y, a veces, la ubicación de la memoria contendrá un nuevo objeto, por lo que obtendrá excepciones de selector no reconocidas.
Transición a las notas de la versión de ARC
__unsafe_unretained
especifica una referencia que no mantiene vivo el objeto al que se hace referencia y no se establece en cero cuando no hay referencias fuertes al objeto. Si el objeto al que hace referencia es desasignado, el puntero se deja colgando.
La Guía de lenguaje de programación Swift de Apple menciona los especificadores de captura unowned(safe)
y unowned(unsafe)
, además de weak
y unowned
.
Yo (creo que) entiendo las diferencias entre weak
y unowned
; pero, ¿cuál es la diferencia entre unowned(safe)
y unowned(unsafe)
? La guía no dice.
Por favor: no confíe simplemente declarando un equivalente de Objective-C.
Aquí hay una cita de los foros de desarrolladores de Apple :
unowned
vs unowned(safe)
vs unowned(unsafe)
unowned(safe)
es una referencia no propietaria que afirma en el acceso que el objeto aún está activo. ¡Es como una referencia opcional débil implícitamente desenvuelta conx!
cada vez que se accede.unowned(unsafe)
es como__unsafe_unretained
en ARC: no es una referencia de propiedad, pero no hay verificación en tiempo de ejecución de que el objeto aún esté activo en el acceso, por lo que las referencias colgantes llegarán a la memoria basura.unowned
es siempre un sinónimo deunowned(safe)
actualmente, pero la intención es que se optimice para lasunowned(unsafe)
en-Ofast
cuando las comprobaciones del tiempo de ejecución están deshabilitadas.
Una simple definición. que aclararía la confusión.
- atributos sin propietario: si intenta acceder a una referencia sin propietario después de que la instancia a la que se refiere se desasigna, su programa se bloqueará.
- atributos no propietarios (inseguros): si intenta acceder a una referencia no segura insegura después de que la instancia a la que se refiere es desasignada, su programa intentará acceder a la ubicación de la memoria donde solía estar la instancia, que es una operación insegura. (no hay garantía si esto se ejecuta o se bloquea)