当たり前の話なんですが、PRレビューをしてたときにふと、「あれ、これってremoveObserverしなくて良いんだっけ?」となったので、動作を確認しました。
動作確認用コードの説明
以下のように2つの画面があります。遷移元のボタンをタップすると遷移先画面が表示されます。
遷移元 | 遷移先 |
---|---|
![]() |
![]() |
遷移先画面の実装はこんな感じです(必要なとこだけ抜粋してます)。
override func viewDidLoad() { NotificationCenter.default.addObserver( self, selector: #selector(notified(_:)), name: UIApplication.didBecomeActiveNotification, object: nil) button.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside) } @objc func notified(_ sender: Any) { print("notified") } @objc func buttonTapped(_ sender: Any) { NotificationCenter.default.removeObserver( self, name: UIApplication.didBecomeActiveNotification, object: nil) }
アプリがフォアグラウンドになったときにdidBecomeActiveNotification
イベントが通知されるようにオブザーバを設定しています。通知を受けたらコンソールに「notified」と表示されます。
また、「Remove Observer!!」ボタンをタップすると、オブザーバが削除されるようになっています。
動作確認結果
以下の流れで確認しました。
- 遷移元のボタンをタップして遷移先画面を表示する
- ホーム画面に戻り、再度アプリをフォアグラウンドにする <- ここで「notified」と表示される
- 遷移先画面をスワイプダウンして遷移元画面に戻る
- ホーム画面に戻り、再度アプリをフォアグラウンドにする <- ここでコンソールには何も表示されない
オブザーバを明示的に削除していませんが、遷移先画面がdismissされると同時にオブザーバも削除されていることがわかります。
また、以下の操作を行うと当然ですがコンソールには何も表示されませんでした。
- 遷移元のボタンをタップして遷移先画面を表示する
- 「Remove Observer!!」ボタンをタップする
- ホーム画面に戻り、再度アプリをフォアグラウンドにする <- ここでコンソールには何も表示されない
- 遷移先画面をスワイプダウンして遷移元画面に戻る
- ホーム画面に戻り、再度アプリをフォアグラウンドにする <- ここでコンソールには何も表示されない
おわりに
わかりきったことですが、疑問に思ってしまったので念の為確認してみました。
こういうことってありますよね(ない?)