2016-03-24 4 views
1

Ich fand eine Code-Schnipsel gab es eine Klasse, und diese Klasse hatte die Eigenschaft von CustomViewController (erbt UIViewController) und im Getter dieser Eigenschaft, sie selbst gespeichert. Der beste Weg, diese heiß zu beschreiben, ist über CodeIst Retain-Zyklus in berechneten Eigenschaften möglich?

class SomeClass: { 

    var alertViewController: UIViewController? { 
     if self.wasRequested { 
      return self.chatController 
     } else { 
      let vc = CutomVC(nibName: "SomeNibName", bundle: nil) 
      vc.alert = self 
      return vc 
     } 
    } 
} 

Wenn Sie nun, dass Viewcontroller präsentieren wird dies jemals de-inited werden? Ist dieser Retain-Zyklus?

Danke

+0

speichert "self" das Ergebnis dieser Methode überhaupt? aka hat es einen Verweis auf diese berechnete CustomVC, Ursache, wenn es nicht ich glaube nicht, es wäre ein Retain-Zyklus. aber wahrscheinlich würde nicht weh tun, um 'vc.alert' eine schwache Referenz zu machen, wenn es nicht schon – Fonix

+0

' vc.alert' ist, sollte wahrscheinlich als eine starke Referenz verlassen werden. Wenn das Ergebnis dieser Methode in einer anderen Ansicht dargestellt wird, ist der Controller 'vc.alert' gleich Null, wenn' self' an anderer Stelle nicht stark beibehalten wird, was vor der Verwendung von 'vc' geschehen kann. Das Ganze wirkt wie ein seltsames Designmuster. –

+0

Ja, es ist in der Tat seltsam :), aber ich war neugierig, was passieren wird .. danke – beretis

Antwort

0

Self wird freigegeben werden, wenn die vc Variable freigegeben wird, wird vorausgesetzt, es ist nicht stark an anderer Stelle verwiesen wird. Dies ist kein Aufbewahrungszyklus, da self nicht stark auf vc verweist.

Wenn jedoch self hinzugefügt vc als Kind View-Controller (durch die Vorlage oder auf andere Weise) selfwürde einen starken Bezug auf vc halten werden. Dies ist technisch ein Retain-Zyklus, aber es ist irrelevant, denn wenn aus seiner übergeordneten Ansicht entfernt wird, entfernt der Controller self alle Verweise auf seine eigenen untergeordneten View-Controller. Dies unterbricht den Rückhaltezyklus zwischen self und vc.

+0

Stellen Sie CollectionView-Controller, der zum Beispiel Bücher (Titel, Autor, Bild) anzeigt, collectionView Datenquelle wäre ein Array von [Alerts] ant Diese Klasse Alert hätte diese berechnete Eigenschaft alertViewController, die auf didSelect präsentiert würde. Das ist was geschieht ... dass die berechnete Eigenschaft dann in navigationStack ist, und dann bin ich verwirrt und neugierig. – beretis

+0

Dies wäre ein Retain-Zyklus, wenn das Array von Alerts von demselben View-Controller beibehalten wird, den jede Alerts beibehalten. Dies führt zu einem Retain-Zyklus, selbst wenn jeder View-Controller aus seinem Super-View-Controller entfernt wird, weil das Array von Alarmen nicht dereferenziert wird. –

+0

Sh * t I ment-Liste von [Book] .... sorry für Verwirrung – beretis

Verwandte Themen