Zyklus in Swift-Delegat beibehalten [duplizieren]

9

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:

%Vor%

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?

    
Bocaxica 15.07.2015, 13:56
quelle

1 Antwort

15

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:

%Vor%

Dann können Sie Ihren Delegaten als weak deklarieren.

    
Aaron Brager 15.07.2015, 14:18
quelle

Tags und Links