Сбой в 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?

0 ответов

Другие вопросы по тегам