2015-12-23 13 views
6

Ta dziwna awaria występuje podczas przechwytywania instancji klasy @objc (napisanej szybkim, ale opatrzonej adnotacją z @objc i podklasy NSObject). Zdarza się, gdy zamknięcie jest przypisane, a nie po wywołaniu, więc problem nie polega na tym, że przechwycona wartość zostanie zwolniona, a następnie wywołane zamknięcie. Zdarza się to losowo, czasami kończy się szybciej, czasem później. Wystąpiłam w tym błędzie we wcześniejszych wersjach Swift (chyba to Swift 1.2), ale teraz używam wersji 2.1 i otrzymuję ten błąd również._swift_abortRetainOdnawiana podczas przechwytywania klasy @objc jako unowned

To działa dobrze, gdy zmienię [unowned x] do [weak x] a następnie do niego dostęp przez życie unwrapping x!.doSomething() która prowadzi mnie do przypuszczenia, że ​​jest to błąd w Swift, aniżeli w moim kodu. Zanim jednak otworzyłem bilet na bugs.swift.org, chciałem mieć na to więcej uwagi, aby upewnić się, że niczego nie brakuje.

Został również wspomnieć tutaj:
http://www.codeproject.com/Articles/791304/Resolving-strong-references-between-Swift-and-Obje
tutaj:
https://www.reddit.com/r/swift/comments/3vhwmj/unowned_bug_in_closure_causes_attempted_to_retain/
i tutaj:
https://forums.developer.apple.com/thread/9873

Ale poza zmianą przechwytywanie do weak i siły rozpakowaniu go później, nie ma rozwiązania .

+0

masz każdy znalazł to, co było przyczyną i dlaczego nie poddaje się obróbce przy użyciu pozostawiony w środku listy przechwytywania? – Whirlwind

+0

Nie, nie, musiałem zmienić wszystkie [niezarejestrowane x] na [słabe x], aby pozbyć się tych awarii. –

Odpowiedz

2

Zazwyczaj wolę używać tego kodu zamiast unowned kiedy mam do czynienia z niektórych zawartych objc klasach:

[weak self] in 
guard let strongSelf = self else { return } 
// use strongSelf below 
Powiązane problemy