Swift behalten Zyklus Erklärung

8

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 ?

    
Yang.ZhiXiao 14.08.2016, 05:37
quelle

2 Antworten

4

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!

    
Sweeper 14.08.2016 07:36
quelle
4

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.

    
renjithr 14.08.2016 08:40
quelle

Tags und Links