LoginSignup
39
39

More than 5 years have passed since last update.

NSNotificationの通知を受け取れるパターンと受け取れないパターンについて

Last updated at Posted at 2014-06-19

NSNotificationでaddObserverする際に、通知の送り手を指定できるのに指定しても動作しなかったのでメモ。

通知を受け取れるパターン

受け手も送り手も送り手を指定しない

[[NSNotificationCenter defaultCenter] addObserver:self
                                        selector:@selector(method:)
                                             name:@"notif"
                                           object:nil]; //誰が送ってこようが気にしない

[[NSNotificationCenter defaultCenter] postNotificationName:@"notif" 
                                                    object:nil]; //誰が送ってるかを指定しない

受け手も送り手もobjectを互いに指定するパターン

[[NSNotificationCenter defaultCenter] addObserver:self
                                        selector:@selector(method:)
                                             name:@"notif"
                                           object:self]; //selfが送ってくるはず

[[NSNotificationCenter defaultCenter] postNotificationName:@"notif" 
                                                    object:self]; //selfが送る

受け手が誰が送ってくるか指定しないパターン

[[NSNotificationCenter defaultCenter] addObserver:self
                                        selector:@selector(method:)
                                             name:@"notif"
                                           object:nil]; //誰が送ってこようが気にしない

[[NSNotificationCenter defaultCenter] postNotificationName:@"notif" 
                                                    object:self]; //selfが送る

通知を受け取れないパターン

受け手が指定した送り手が、送ってこない

[[NSNotificationCenter defaultCenter] addObserver:self
                                        selector:@selector(method:)
                                             name:@"notif"
                                           object:self]; //送り手をselfに指定

[[NSNotificationCenter defaultCenter] postNotificationName:@"notif" 
                                                    object:nil]; //送り手を指定していない

おまけ

すべての通知を受け取れるパターン

パラメータのnameをnilにするとスタティックリンクされたビルド済みのライブラリの通知すらも受け取れる

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(method:)
                                             name:nil
                                           object:nil];

さいごに

NSNotificationは強力すぎてコードの複雑度が増すため、自分はNSNotificationを使わないと実現できない場合でしか使わないようにしていたため、今まで上記のことを調べていなかったので、受け手は送り手を指定、送り手は受け手を指定するものだと勘違いしていた。

指定できるのはどちらも送り手で、受け手が送り手を指定した場合は送り手からのNotificationでない場合は受け取れない。受け手側はフィルタを指定するイメージが分かりやすい、とのこと。

39
39
2

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
39
39