Ich habe ein UIViewController
und darin ein UIToolbar
. Sie werden von einem Storyboard instanziiert.
Ich habe eine benutzerdefinierte Klasse für meine UIToolbar
erstellt. Basierend auf irgendeiner Logik zeige ich oder zeige keine Knöpfe darauf.
Der UIViewController
muss aktiv werden, wenn einige der Schaltflächen angetippt werden.
Dafür habe ich ein Delegate-Protokoll in UIToolbar
erstellt.
Momentan, 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. Allerdings verwende ich Swift, und ich kann delegate
variable nicht als weak
definieren:
Wenn ich den View-Controller verwarne, setze ich self.toolBar.navigationDelegate = nil
und der Speicher wird gelöscht. Aber es fühlt sich falsch an!
Warum bekomme ich den Retain-Zyklus und warum kann ich den Delegaten nicht einfach als weak
definieren?
weak
referenzen gelten nur für Klassen, nicht für Strukturen oder enums, die Werttypen sind. Protokolle können jedoch standardmäßig für jeden dieser Typen verwendet werden.
Definieren Sie Ihr MainToolBarDelegate
als Nur-Klassen-Protokoll:
Dann können Sie Ihren Delegaten als weak
deklarieren.
Tags und Links ios swift delegates retain-cycle