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でない場合は受け取れない。受け手側はフィルタを指定するイメージが分かりやすい、とのこと。