LoginSignup
1
1

More than 3 years have passed since last update.

[Swift]NavigatonControllerで戻る押したら「Attempted to read an unowned reference but the object was already deallocated」

Posted at

状況

ナビゲーションの遷移先.swift
override func loadView() {
    bind()
}

func bind() {
     shareButton?.rx.tap
         .subscribe { [unowend self] _ in
             self.huga() //戻るボタン押したらここでcrash(signal: SIGABRT)
         //.subscribeのスコープ抜け出す時にcrashするみたい
         }
        .disposed(by: disposeBag)
}

エラー文

Fatal error: Attempted to read an unowned reference but the object was already deallocated

解決策

ナビゲーションの遷移先.swift
override func loadView() {
    bind()
}

func bind() {
     shareButton?.rx.tap
         .subscribe { [weak self] _ in //弱参照に変更(unowend -> weak)
             self?.huga() //nilを許容
         }
        .disposed(by: disposeBag)
}

Rxが原因でも(遷移先で使用していた)WKWebViewが原因でもなく
遷移時のクロージャの参照が原因でした。
強参照、弱参照、循環参照どれも聞いたことはあるものの全然理解していなかったのであとでまとめます。
参考記事もわかりやすいものがたくさんありました。

参考

Swiftの循環参照問題におけるunownedとweakの使い分けについて - Qiita
SwiftのARCとクロージャのキャプチャ - しおメモ
Swift [unowned self]を[weak self]に修正してみた | RE:ENGINES

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1