2015-07-15 10 views
8

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?

+2

È 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. –

risposta

14

weak i riferimenti si applicano solo alle classi, non alle strutture o alle enumerazioni, che sono tipi di valori. Ma i protocolli per impostazione predefinita possono essere applicati a qualsiasi di questi tipi.

Definisci il tuo MainToolBarDelegate come classe-unico protocollo:

protocol MainToolBarDelegate: class { 

} 

allora sarete in grado di dichiarare il delegato come weak.

+0

sai se c'è qualche differenza tra l'uso di: class o: NSObjectProtocol – user2363025

+1

@ user2363025 'class' indica qualsiasi classe, e' NSObjectProtocol' significa qualsiasi cosa che sia conforme a questo protocollo. Userei 'class' a meno che tu non abbia una ragione specifica per usare' NSObjectProtocol'. –