2015-11-11 7 views
9

Jeśli oświadczam [weak self] na zamknięciu i odniesienie self jako self? wewnątrz UIView.animateWithDuration aplikacja padnie:Referencja [słabe ja] jako jaźń? wewnątrz animateWithDuration powoduje awarii

someFunc() { [weak self] (success) -> Void in 
    UIView.animateWithDuration(0.25) { 
     self?.someView.alpha = 1; 
    } 
} 

z message sent to deallocated instance

ale gdybym ewentualnie rozpakować siebie przed czasem to robi 't

someFunc() { [weak self] (success) -> Void in 
    if let weakself = self { 
     UIView.animateWithDuration(0.25) { 
      weakself.someView.alpha = 1; 
     } 
    } 
} 

Dlaczego tak jest, myślę, że nie ma znaczenia, w jaki sposób powołuję się na słaby punkt Jeśli chcesz "po prostu" odpakować poprawnie self?. Dla kontekście odbywa się to w UICellView który jest zwalniane, kiedy opuszczają UICollectionViewController

EDIT: Zapisano błąd z jabłkiem: # 23492648

+0

To jest naprawdę bardzo dziwne, pachnie jak błąd. Btw co jest niepotrzebnego ';'? Czy dzwonisz do funkcji, czy jest to właściwość? – Kametrixom

+1

Dzięki za wskazanie tego, edytowałem to dla jasności zamiast 'doSomething'. Poprosiłem o użycie ';' w naszej bazie kodu, ponieważ sprawia, że ​​koniec instrukcji jest jednoznaczny. Są sytuacje, w których możesz mieć oświadczenie zawijać linię i nie jest to zbyt oczywiste :) – Shizam

+0

To jest dobry raport o błędzie i powinieneś zgłosić to firmie Apple. Ale jest również prawdą, że zawsze powinieneś robić słabo-mocny taniec, gdy słabo przekazywać rzeczy anonimowo, jak to robisz w drugim przykładzie ("jeśli pozwólcie słabo = sobie"), więc róbcie to i ruszajcie dalej. – matt

Odpowiedz

3

myślę tu jest problem, że self jest wyjątkowy. Przekazywano słabo referencję do self w funkcji anonimowej, aby zapobiec cyklowi zatrzymania, ale w tej historii nie ma tak naprawdę Opcjonalnego pakowania self. W związku z tym, cukier syntaktyczny jest tylko cukierkiem syntaktycznym - nie działa.

Możliwe, że Apple uzna to za błąd; albo może nie. Ale tak czy inaczej, rozwiązaniem jest formalne wykonanie dokładnie tego, co robisz w drugim przykładzie: czy słaby silny taniec jawnie.