Wo kommt das schwache selbst gehen?
Ich machen das oft,
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) {
beep()
}
und in einer app tun wir das oft
tickle.fresh(){
msg in
paint()
}
aber wenn Sie das tun diese
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) {
tickle.fresh(){
msg in
paint()
}
}
natürlich haben Sie zu tun diese
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) { [weak self] _ in
tickle.fresh(){
msg in
self?.paint()
}
}
oder vielleicht diese
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) {
tickle.fresh(){
[weak self] msg in
self?.paint()
}
}
oder vielleicht
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) { [weak self] _ in
tickle.fresh(){
[weak self] msg in
self?.paint()
}
}
W T H sollen wir tun?
Alle drei Vorschläge scheinen perfekt funktionieren. Was die ganze Tiefe der Bedeutung hier? Und was soll man tun? Ist einen starken Hinweis auf eine schwache Referenz, eine schwache oder starke Referenz? Sein oder nicht sein? Das ist die Frage!
- Die überschrift hier ist ganz existenzielle !
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste von allen, beachten Sie, dass Sie in der Regel brauchen nicht zu befürchten, behalten Zyklen mit
DispatchQueue.main.asyncAfter
, als die Schließung wird ausgeführt einige Punkt. Also, ob oder nicht Sie schwach captureself
Sie nicht die Schaffung eines permanenten retain-Zyklus (unter der Annahme, dasstickle.fresh
auch nicht).Ob oder nicht Sie einen
[weak self]
capture-Liste auf der äußerenasyncAfter
Schließung hängt ganz davon ab, ob Sie wollenself
beibehalten werden, bis die Schließung genannt wird (nach der Zeit, die Sie festgelegt). Wenn Sie nicht brauchenself
am Leben zu bleiben, bis die Schließung genannt wird, setzen[weak self]
in, wenn Sie tun, dann tun Sie es nicht in.Ob oder nicht Sie einen
[weak self]
auf den inneren Verschluss (den man übergebentickle.fresh
) hängt davon ab, ob Sie bereits schwach erfasstself
im äußeren Verschluss. Wenn Sie nicht haben, dann können Sie[weak self]
um zu verhindern, dass die innere Schließung von behalten Sie. Wenn jedoch der äußere Verschluss hat bereits schwach erfasstself
, dann die innere Schließung wird bereits haben einen schwachen Verweis aufself
, damit das hinzufügen[weak self]
auf die innere Schließung keine Auswirkungen.Also, um zusammenzufassen:
self
beibehalten werden, indem die äußere und die innere Schließung.self
wird nicht beibehalten werden, indem entweder die Schließung.Gleiche wie die oben genannten, die zusätzliche
[weak self]
für den inneren Verschluss hat keine Auswirkung, daself
ist schon schwach, gefangen von den äußeren Verschluss.self
beibehalten werden, indem die äußere Schließung, aber nicht die innere Schließung.Natürlich könnte es sein, dass Sie nicht möchten, dass
self
beibehalten werden, indem die äußere Schließung, aber Sie tun wollen es beibehalten werden, indem der innere Verschluss. In solchen Fällen können Sie deklarieren eine lokale variable, in die äußere Schließung, um zu halten einen starken Bezug zurself
, wenn Sie können und nehmen Sie dann in den inneren Verschluss:Nun
self
nicht am Leben gehalten werden, indem die äußere Schließung, aber sobald es heißt, wennself
noch existiert, wird es am Leben gehalten werden, indem der innere Verschluss bis Verschluss wurde aufgehoben.In Antwort auf:
Schwache Referenzen sind implementiert Optionen, die sind Wert-Typen. Daher kann man nicht direkt haben einen starken Bezug zu einem – statt Sie zuerst Auspacken, und dann nehmen einen starken Bezug auf die zugrunde liegende Instanz. In diesem Fall sind Sie einfach im Umgang mit einem starken Verweis (genau wie mein Beispiel oben mit
strongSelf
).Jedoch, wenn eine schwache Referenz ist boxed (dies geschieht mit Verschluss Erfassung der Wert-Typ wird in einen heap-allokierten Feld) – dann kann man in der Tat einen starken Bezug zu diesem Feld. Der Effekt ist äquivalent zu einem schwachen Verweis auf die original-Instanz, die Sie gerade haben eine unsichtbare bisschen extra Umweg.
In der Tat, dies ist genau was passiert in dem Beispiel, in dem die äußere Schließung schwach erfasst
self
und die innere Schließung 'stark erfasst', dass die schwache Referenz. Der Effekt ist, dass weder die Schließung behältself
.self!
? da dieself
"von der ersten Zeile dieses code-fragment ist ein optionales Recht????self
wird lebendig gehalten durch die äußere Schließung, aber sobald es ausgeführt wurde, könnte es sein, aufgehoben, bevor der innere Verschluss wird ausgeführt (unter der Annahme, dass es asynchron ausgeführt). Und im letzten Beispiel, ich bin mit der optionalen verbindlich mitguard let
, die packt die schwacheself
, dass Sie mir einen starken Hinweis darauf 🙂[weak self]
ist nicht erforderlich, wenn der äußere Verschluss erfasstself
schwach.