Avatar
その場合、最初のABと次のABは別のインスタンスになるはずです。(そうでないならばなにか不思議なことが起こると思います...) (edited)
3:24 AM
で、そうであるならばBが2つ存在して1つの通知は異なる両方のBで受け取っていると思います。
3:25 AM
deinitが呼ばれないは最初のABについて、ということですね。pushしているのであればそれは期待する動作です。
3:27 AM
NSNotificationCenter (Swift の NotificationCenter)はobserverを保持(所有)しません。ですので「登録時のインスタンスを保持したままになっている」というより、登録時のインスタンスを弱参照しているがより正しいです。
3:28 AM
しかし、それぞれのView Controllerはnavigationのスタックに保持(所有)されているので、その所有が続く限りはそれらのView Controllerすべてに通知が届きます。
3:31 AM
なお正確には NSNotificationCenter は弱参照と同時に通知の登録情報を保持します。この登録情報は unregisterするか、次回通知を送るときに参照先がなくなったときにしかメモリから消去されません。ですので、observeしている通知がレアなものであるばあい、登録情報がリークします。(これはドキュメントにうっすら書かれているだけなのであまり知られていないのですが...) ですので、必要がないと書かれているインターネットの情報は多いと思いますが実際は observer (この場合、ViewController) の deinit() で unregister するほうが良いです。 (edited)