pozostawiony odniesienia nie zachowuje wyraźne odniesienie do siebie, ale to sprawia, że założenie, że obiekt zawsze ma jakąś wartość (nie jest zerowa) i jeśli, jak niektórzy dealokuje self podczas wykonywania bloku, powyższy kod awarie.
W przypadku słabych, jak w twoim przykładzie, słabe jest opcjonalnym typem wewnątrz bloku, więc może być również wartość lub może być zero. Twoim obowiązkiem jest sprawdzenie, czy wartość istnieje i metody połączeń na niej. Jak wyżej, jeśli używasz rozpakowującego operatora (!), Gdy self został zwolniony, to z pewnością ulega awarii. Tak więc, zarówno wersja kodu ulega awarii, jeśli zdarza się tak, że blok jest nadal wykonywany, a self jest dealokowane w międzyczasie.
Więc proponuję użyć słaby, by chronić takie awarie stosując opcjonalne kontrole,
{ [weak self] in
if let me = self {
me.number = me.number + 1
}
}
Czy masz na myśli masz awarię, podczas wykonywania tego kodu? – Sandeep
Tak, jeśli self został zwolniony. Pytam, czy oba bloki zawsze zachowują się tak samo logicznie? –