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