Ich habe versucht, eine Menge Forschung über das Verständnis von Retain-Zyklen zu tun. Ich kann jedoch nichts an meinen Beispielen finden. Ich weiß, dass, wenn ich eine Eigenschaft auf eine Schließung setze, ein Retain-Zyklus stattfindet und schwache oder nicht-kommunizierte verwenden muss. Aber ich habe 2 Beispiele, die ich gerne wissen würde, ob sie richtig gemacht wurden: Danke im Voraus, ich habe versucht zu sehen, ob sie bereits auf stackoverflow sind, aber nichts gefunden haben.Swift Retain Cycles und Closures
einfache Animationen
UIView.transitionWithView(self, duration: 5, options: .TransitionCrossDissolve, animations: { [weak self] in
self?.setNeedsDisplay()
return
}, completion: nil)
Animationen mit einem Array
for imageView in self.townImages {
UIView.transitionWithView(imageView, duration: 0.3, options: .TransitionCrossDissolve, animations: {() -> Void in
imageView.image = UIImage(named: self.getImages()[count++])
}, completion: nil)
}
In beiden Beispielen self
ist eine Unterklasse von UIView
. Ich möchte nur wissen, dass ich es richtig mache oder ob ich imageView auch als schwache Referenz verwenden soll. Vielen Dank.
Also bedeutet das, dass es nur einen Retain-Zyklus erstellt, wenn meine Klasse einen Verweis auf den Block enthält? Oder würde die 'UIView.transitionWithView'-Methode auch einen Retain-Zyklus erzeugen? Mit anderen Worten, wenn eine Klasse einen Verweis auf den Block hätte, würde es einen Retain-Zyklus erzeugen. – smitt04
auch die Rückkehr im ersten Beispiel war, weil in swift, wenn nur eine Aussage in einer Schließung gemacht wurde, es automatisch diesen Wert zurückgibt, und in diesem Fall erwartete die Schließung einen Rückgabewert von Void, also verwende ich die Rückkehranweisung, um void und nicht zurückzugeben das Ergebnis von 'self? .setNeedsDisplay()' – smitt04
Ja, seltsam aber wahr: in Swift brauchst du die Rückkehr in diesem Fall. Eine der Kuriositäten der verschiedenen Regeln der Sprache für die Schließung von einem Statement. (Und die aktuelle Version des Compilers wirft eine irrelevante und völlig irreführende Fehlermeldung, wenn sie auch nicht da ist ...) –