No, definitivamente hay momentos en los que no querrás usar [unowned self]
. A veces, desea que el cierre se capture a sí mismo para asegurarse de que todavía esté presente para cuando se cierre.
Ejemplo: hacer una solicitud de red asincrónica
Si realiza una solicitud de red asincrónica , desea que se retenga el cierre self
cuando finalice la solicitud. De lo contrario, ese objeto puede haber sido desasignado, pero aún así desea poder manejar el final de la solicitud.
Cuando usar unowned self
oweak self
El único momento en el que realmente desea usar [unowned self]
o [weak self]
es cuando crearía un ciclo de referencia fuerte . Un ciclo de referencia fuerte es cuando hay un ciclo de propiedad en el que los objetos terminan siendo propietarios (tal vez a través de un tercero) y, por lo tanto, nunca se desasignarán porque ambos se aseguran de que el otro se quede.
En el caso específico de un cierre, solo necesita darse cuenta de que cualquier variable a la que se haga referencia dentro de ella, se "apropia" del cierre. Mientras el cierre esté alrededor, se garantiza que esos objetos estarán alrededor. La única forma de detener esa propiedad es hacer el [unowned self]
o [weak self]
. Entonces, si una clase posee un cierre, y ese cierre captura una referencia fuerte a esa clase, entonces tiene un ciclo de referencia fuerte entre el cierre y la clase. Esto también incluye si la clase posee algo que posee el cierre.
Específicamente en el ejemplo del video
En el ejemplo de la diapositiva, TempNotifier
posee el cierre a través de la onChange
variable miembro. Si no declararan self
como unowned
, el cierre también sería propio self
creando un ciclo de referencia fuerte.
Diferencia entre unowned
yweak
La diferencia entre unowned
y weak
es que weak
se declara como Opcional mientras unowned
que no lo es. Al declararlo, weak
puede manejar el caso de que podría ser nulo dentro del cierre en algún momento. Si intenta acceder a una unowned
variable que resulta ser nula, se bloqueará todo el programa. Por lo tanto, solo use unowned
cuando sea positivo que la variable siempre estará alrededor mientras el cierre esté alrededor
onChange
debe ser un[weak self]
cierre, ya que es una propiedad pública (internamente, pero aún así), por lo que otro objeto podría obtener y almacenar el cierre, manteniendo el objeto TempNotifier alrededor (indefinidamente si el objeto en uso no soltó elonChange
cierre hasta que vio queTempNotifier
se había ido, a través de su propia referencia débil aTempNotifier
) . Sivar onChange …
fueraprivate var onChange …
así[unowned self]
, sería correcto. Sin embargo, no estoy 100% seguro de esto; alguien me corrija por favor si me equivoco.[]
? No puedo encontrar la explicación en los documentos de Apple.{}
es el cierre vacío (la instancia del cierre) como predeterminado (no hace nada),(Int) -> Void
es la definición de cierre.