6

Wenn Sie innerhalb eines Verschlusses auf self verweisen müssen, ist es ratsam, ihn als weak oder unowned zu übergeben, um einen Rückhaltezyklus zu verhindern.Führt das Übergeben einer Funktion, die zu "self" gehört, zu einem Retain-Zyklus, wenn er nicht geschlossen ist?

Übergeben Sie die Funktion, die direkt an self gehört, einen Retain-Zyklus? Oder muss es in einem Verschluss verschachtelt werden, um sich selbst zu schwächen?

Pass direkt

UIView.animateWithDuration(0.3, 
     delay: 0.0, 
     usingSpringWithDamping: 0.7, 
     initialSpringVelocity: 0.1, 
     options: .CurveEaseOut, 
     animations: self.view.layoutIfNeeded, // does this cause retain cycle? 
     completion: nil) 

Wrapping in einem Verschluss

UIView.animateWithDuration(0.3, 
     delay: 0.0, 
     usingSpringWithDamping: 0.7, 
     initialSpringVelocity: 0.1, 
     options: .CurveEaseOut, 
     animations: { [unowned self] in 
      self.view.layoutIfNeeded() 
     }, 
     completion: nil) 

Antwort

3

Dies sollte keinen Referenzzyklus erstellen, aber selbst wenn es das getan hätte, wäre das in Ordnung. Der Referenzzyklus würde nur existieren, bis die Animation abgeschlossen ist, an diesem Punkt wäre sie unterbrochen. Das Erstellen von kurzlebigen Referenzzyklen kann tatsächlich von Vorteil sein, da sichergestellt wird, dass das Ziel für die Dauer des Anrufs weiterhin existiert. Zyklen sind nicht von Natur aus ein Problem. Unbreakable Zyklen sind das Problem.

Es gibt zwei Gründe, warum dies keinen Zyklus erzeugt. Erstens gibt es keinen "Zyklus". Das System wird sich auf etwas beziehen (mehr dazu in einer Sekunde), sicher. Aber wo ist der Bezug auf "das, was auf etwas verweist?" Um es etwas deutlicher zu sagen, auch wenn das Animationssystem self referenziert, wie ist self Bezug auf das Animationssystem? Es gibt keinen Zyklus.

Der andere Grund, warum es keinen Zyklus gibt, ist, dass Sie self sowieso nicht zum Animationssystem übergehen. Ihre Weitergabe self.view.layoutIfNeeded. das ist in Swift, das entspricht:

UIView.layoutIfNeeded(self.view) 

Sie sind nicht self hier vorbei. Du gibst eine Ansicht weiter. Jetzt wird das Animationssystem fast sicher wird einen Verweis auf diese Ansicht halten, bis die Animation abgeschlossen ist, aber das ist in Ordnung. Das ist immer noch kein Zyklus.

+1

Große Erklärung, danke – Chris

1

Es gibt keinen Hinweis Zyklus da self nicht die Schließung erfassen aber wenn Sie nicht wollen, dass es ist ein weiterer starker Hinweis auf self Sie können den Wickelverschluss verwenden.

Wenn Sie sicher sind, dass self nicht in den nächsten 0,3 Sekunden aufgehoben wird, können Sie unowned verwenden, andernfalls weak. (Ich würde weak nur verwenden, um sicher zu sein, dass es nicht abstürzt)

Verwandte Themen