2015-07-15 14 views
8

Ich habe eine UIViewController und darin eine UIToolbar. Sie werden von einem Storyboard instanziiert.Retain Cycle in Swift Delegat

Ich habe eine benutzerdefinierte Klasse für meine UIToolbar gemacht. Basierend auf irgendeiner Logik zeige oder zeige ich keine Knöpfe darauf.

Die UIViewController muss aktiv werden, wenn einige der Tasten angetippt werden. Dafür habe ich ein Delegate-Protokoll in der UIToolbar erstellt.

Derzeit, wenn ich die Ansicht verwerfe, wird sie im Speicher gehalten. Weitere Untersuchungen ergaben, dass mein Delegierter einen Retain-Zyklus erstellt hat.

In Objective-C würden wir Delegaten einfach als weak definieren. Ich Swift jedoch benutze und es erlaubt mir nicht, delegate Variable als weak zu definieren:

weak var navigationDelegate: MainToolBarDelegate? 
// 'weak' cannot be applied to non-class type 'MainToolBarDelegate' 

Wenn ich die View-Controller entlassen, habe ich self.toolBar.navigationDelegate = nil und der Speicher gelöscht wird. Aber es fühlt sich falsch an!

Warum bekomme ich den Retain-Zyklus und warum kann ich den Delegaten nicht einfach als weak definieren?

+2

Ist Ihr NavigationDelegate ein Protokoll (im Gegensatz zu einem [Nur-Klasse-Protokoll] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/ doc/uid/TP40014097-CH25-ID281)?) Wenn es nur ein Standardprotokoll ist, gibt es keine Garantie, dass Ihr tatsächliches Objekt eine Klasseninstanz und keine Struktur ist, daher "kann nicht auf Nicht-Klassen-Typ angewendet werden"; Wenn es eine Struktur oder ein Enum sein könnte, dann kann es nicht "schwach" sein, da es kein Referenztyp ist. –

Antwort

14

weak Referenzen gelten nur für Klassen, nicht Strukturen oder enums, die Werttypen sind. Protokolle können jedoch standardmäßig für jeden dieser Typen verwendet werden.

Definieren Sie Ihre MainToolBarDelegate als Klasse-only-Protokoll:

protocol MainToolBarDelegate: class { 

} 

Dann können Sie Ihre Stellvertretung als weak erklären.

+0

Wissen Sie, ob es einen Unterschied zwischen der Verwendung von: class oder: NSObjectProtocol gibt – user2363025

+1

@ user2363025 'class' bedeutet eine Klasse und' NSObjectProtocol' bedeutet alles, was diesem Protokoll entspricht. Ich würde 'class' verwenden, außer Sie haben einen bestimmten Grund,' NSObjectProtocol' zu verwenden. –