Ho un UIViewController
e in esso un UIToolbar
. Vengono istanziati da uno storyboard.Conservare il ciclo in delegato Swift
Ho creato una classe personalizzata per il mio UIToolbar
. Basandomi su qualche logica, faccio o non mostro i pulsanti su di esso.
Il UIViewController
deve intervenire quando alcuni dei pulsanti vengono toccati. Per questo ho creato un protocollo delegato nel UIToolbar
.
Attualmente, quando ignoro la vista, viene mantenuta in memoria. Ulteriori indagini hanno rivelato che il mio delegato ha creato un ciclo di conservazione.
In Objective-C, dovremmo semplicemente definire i delegati come weak
. Tuttavia, io sto usando Swift, e non mi permette di definire delegate
variabile come weak
:
weak var navigationDelegate: MainToolBarDelegate?
// 'weak' cannot be applied to non-class type 'MainToolBarDelegate'
Quando ho respingere il controller della vista, ho impostato self.toolBar.navigationDelegate = nil
e la memoria ottiene cancellata. Ma sembra sbagliato!
Perché viene visualizzato il ciclo di conservazione e perché non è possibile definire semplicemente il delegato come weak
?
È il tuo NavigationDelegate un protocollo (al contrario di un [protocollo di solo classe] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/ doc/uid/TP40014097-CH25-ID281)?) Se si tratta solo di un protocollo standard, non c'è alcuna garanzia che il tuo oggetto reale sia un'istanza di classe piuttosto che una struttura, quindi "Non può essere applicato a un tipo non di classe"; se potrebbe essere una struttura o un enum, quindi non può essere 'debole', in quanto potrebbe non essere un tipo di riferimento. –