¿Por qué no hay necesidad de liberar un Outlet configurado con “asignar”?
-
03-07-2019 - |
Pregunta
He estado leyendo eso si tengo algo como esto:
@property (nonatomic, assign) UIView *anView;
Entonces no tengo que preocuparme por la administración de la memoria. No tengo que hacer [anView release] en el método -dealloc.
¿Por qué?
" asignar " simplemente le dice al compilador: "Hey hombre, esta propiedad no retiene lo que alguien le asigna". Y luego puedes hacerlo
@synchronize anView;
y el compilador crea mágicamente un getter y setter, donde el setter puede verse así:
- (UIView*) anView {
return anView;
}
y el Setter puede parecer:
- (void) setAnView:(UIView*)newAnView {
anView = newAnView;
}
correcto / incorrecto? Si eso fue correcto, el colocador no reclama la propiedad de la nueva variable AnView, ya que no es un " retener " propiedad. Simplemente lo toma y lo asigna a la variable de instancia. Por lo tanto, al considerar la política de propiedad, no es necesario liberar la variable de instancia anView en -dealloc. El objeto no lo posee. ¿Es eso correcto?
Solución
Sí, básicamente eres correcto. Supongamos que el recolector de basura está apagado (de lo contrario no importa).
Al usar las propiedades 'asignar', no tiene que liberar el objeto porque nunca lo retuvo (es responsabilidad de otra persona).
Esencialmente, esto crea una referencia débil: una vista puede ser desasignada mientras la propiedad aún lo apunta. Normalmente, usaría 'asignar' para tipos de datos primitivos, no para objetos.