Hier ist meine benutzerdefinierte Ansicht:
%Vor%und der View Controller:
%Vor%Wenn der Controller aus dem Navigationsstapel entnommen wird, ist alles in Ordnung:
%Vor%Aber wenn ich diesen Code ersetze:
%Vor%mit diesem:
%Vor%Dann wird nichts auf der Konsole gedruckt. Die CustomView und ViewController sind nicht freigegeben, warum?
Warum erfasst customView.onTapViewHandler = didTapBlue
einen Verweis auf self
?
Wenn Sie die Erfassungsliste [unowned self]
zum Abschluss hinzufügen, enthält die Ansicht einen schwachen Verweis auf self
und self
enthält eine starke Referenz auf die Ansicht.
Da nichts einen starken Verweis auf self
hat, kann self
beim Aufrufen des View-Controllers deinitialisiert werden. Nachdem self
deinitialisiert wurde, hat nichts mehr einen starken Bezug auf die Ansicht, daher wird auch es deinitialisiert.
Wenn Sie die Aufnahmeliste entfernen, enthält self
eine starke Referenz auf die Ansicht und die Ansicht enthält eine starke Referenz auf self
. Dies bedeutet, dass zur Deaktivierung von self
zuerst die Ansicht deinitialisiert werden muss (wodurch die starke Referenz aufgelöst wird). Damit die Ansicht jedoch deinitialisiert werden kann, muss der Ansichtscontroller zunächst deinitialisiert werden, um den starken Verweis auf die Ansicht aufzuheben. Sie können den starken Verweis auf die Ansicht jedoch nur dann aufheben, wenn Sie den Ansichtscontroller deinitialisieren. Sie können den starken Verweis auf den Ansichtscontroller nicht aufheben, wenn Sie die Ansicht nicht initialisieren.
Siehe? Wir sind hier in eine Endlosschleife geraten! Weder der View noch der View Controller werden deinitialisiert!
Swift-Funktion ist eine Art von Schließung. So wie closure (Block in objective c) können Funktionen Referenzen erfassen.
wenn customView.onTapViewHandler = didTapBlue
bekommt eine Referenz auf self
ie ViewControllerB
referenz in diesem Fall wird vom Funktionsaufruf erfasst.
Gleicher Wert ViewControllerB
's Ansicht enthält einen starken Verweis auf CustomVIew
, so dass der Zyklus beibehalten wird.
Über die Verwendung von unowned
, Apple Dokument sagt:
Schwache und nicht zugeordnete Referenzen aktivieren eine Instanz in einem Referenzzyklus sich auf die andere Instanz beziehen, ohne sie fest zu halten. Die Instanzen können sich dann aufeinander beziehen, ohne ein starkes zu erzeugen Referenzzyklus.
Das bedeutet, dass kein zyklischer Verweis und Zyklus beibehalten wird.