Swift-Verschlüsse - Erfassung selbst als schwach
Ich versuche mich zu lösen, eine Schließung basiert stark Referenz-Zyklus, in Swift.
In dem code unten, so wird das Objekt beibehalten, durch die der Besitz view-controller. ProgressHUD
ist ein UIView
auch beibehalten, durch die der Besitz view-controller. ProgressHUD
zugespielt wird jedes mal der Abschluss-handler aufgerufen wird. Wenn mit dem neuen Verschluss-capture-Funktion, deklarieren sich selbst als schwach oder der Besitzer nicht lösen das memory-leak.
object.setCompletionHandler { [weak self] (error) -> Void in
if(!error){
self?.tableView.reloadData()
}
self?.progressHUD?.hide(false)
}
Allerdings, wenn ich erkläre einer schwachen var für sich selbst außerhalb der Verschluss, es behebt das Speicher-Leck, wie diese:
weak var weakSelf = self
object.setCompletionHandler { (error) -> Void in
if(!error){
weakSelf?.tableView.reloadData()
}
weakSelf?.progressHUD?.hide(false)
}
Irgendwelche Ideen, warum dies nicht funktioniert mit Swift erfassen?
- es sollte auch nicht behalten-Zyklus
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bei der Zuweisung einer closure an eine Eigenschaft einer Instanz der Klasse, und der Stilllegung erfasst, die Instanz mit dem Verweis auf die Instanz oder Ihre Mitglieder, erstellen Sie eine starke Referenz-Zyklus zwischen dem Verschluss und der Instanz. Swift setzt capture-Listen, brechen diese starken Bezug Zyklen. Quelle Apple
Quelle sketchyTech Zunächst ist es wichtig, deutlich zu machen, dass dieses ganze Thema betrifft nur die Verschlüsse, wo wir bei der Zuordnung "eine Schließung einer Eigenschaft einer Instanz der Klasse". Beachten Sie dies, mit jeder Regel.
Die Regeln:
In answear zu deiner Frage, es sollte kein retain-Zyklus.
Du sagtest, dass progressHUD beibehalten wird, die durch den Besitz view-controller (selbst) und Sie verweisen in Ihrer Schließung..., so fügen Sie es zu der capture-Liste und verwenden Sie dann die aufgenommenen Variablen in der closure wie folgt:
self?.tableView
sollte geändert werden, umself.tableView
.Dies ist, wie ich es bisher getan haben es:
Versuchen Sie Folgendes: