Сбой в swift_unknownObjectUnownedTakeStrong из-за ошибочного использования unowned
Я получил сбой в сети. Обратная трассировка выглядит следующим образом:
0 libsystem_kernel.dylib __pthread_kill + 8
1 libsystem_pthread.dylib pthread_kill + 272
2 libsystem_c.dylib abort + 104
3 libswiftCore.dylib swift_vasprintf(char**, char const*, char*) + 58
4 libswiftCore.dylib swift::swift_abortRetainUnowned(void const*) + 36
5 libswiftCore.dylib swift_unknownObjectUnownedTakeStrong + 74
class A {
function f() {
RCTBridge.current()?.dispatchBlock({ [unowned self] in
// closure body goes here
}, queue: RCTJSThread)
}
}
Согласно Swift doc
Незарегистрированная ссылка
- не держит сильную власть над экземпляром, к которому он относится
- ожидается, что бесхозная ссылка всегда будет иметь значение
Итак, в моем случае экземпляр живет дольше, чем экземпляр класса A. После освобождения экземпляра
closure
сохранено
RCTBridge
экземпляр все еще пытается уважать
unowned
Справка
self
. Лучше использовать
weak self
здесь.
Слабая ссылка
- не держит сильную власть над экземпляром, к которому он относится
- ARC автоматически устанавливает слабую ссылку на nil, когда экземпляр, на который она ссылается, освобождается.
После того, как я использовал слабую ссылку, проблема исчезла. интересно, если
Unowned Reference
работает как
unsafe_unretained
в Objective-C?