ios swift delegates retain-cycle

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 ?