ios - Mantener el ciclo en delegado Swift
delegates retain-cycle (1)
weak
referencias weak
solo se aplican a las clases, no a las estructuras o enumeraciones, que son tipos de valores. Pero los protocolos por defecto pueden aplicarse a cualquiera de esos tipos.
Defina su MainToolBarDelegate
como un protocolo de solo clase:
protocol MainToolBarDelegate: class {
}
Entonces podrás declarar tu delegado como weak
.
Esta pregunta ya tiene una respuesta aquí:
Tengo un UIViewController
y en él una UIToolbar
. Se crean instancias de un guión gráfico.
Hice una clase personalizada para mi UIToolbar
. Basado en cierta lógica, tengo o no botones en él.
El UIViewController
necesita tomar medidas cuando se UIViewController
algunos de los botones. Para esto creé un protocolo delegado en la UIToolbar
.
Actualmente, cuando descarto la vista, se guarda en la memoria. La investigación adicional reveló que mi delegado creó un ciclo de retención.
En Objective-C, simplemente definiríamos a los delegados como weak
. Sin embargo, estoy usando Swift, y no me permite definir la variable de delegate
como weak
:
weak var navigationDelegate: MainToolBarDelegate?
// ''weak'' cannot be applied to non-class type ''MainToolBarDelegate''
Cuando self.toolBar.navigationDelegate = nil
el controlador de vista, configuro self.toolBar.navigationDelegate = nil
y la memoria se borra. ¡Pero se siente mal!
¿Por qué obtengo el ciclo de retención y por qué no puedo simplemente definir al delegado como weak
?