という現象が起きてしまっていて発見するまで時間がかかったのでメモしておきます。
まず、現象としては、
メソッドは、viewDidLoadの中で、
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(callHogehoge:)
name:@"kCallHogehoge"
}
と宣言しておきます。
-(void)callHogehoge
{
// ほげほげ
self.hogehoge = 1;
}
としておいて、
別のスレッドで、
-(void)callHogehoge
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"kCallHogehoge" object:nil userInfo:info];
}
と一回だけ呼んでるのに、callHogehogeが何回も実行されるという現象でした。
どこかで別スレッドで呼ばれているのかと思ったのですが、メインスレッドで呼ばれています。
次に疑ったのが、self.hogehoge として保存してる値。別のところで値を書き換えているのにもかかわらず、callHogehogeが呼ばれるときは値が元に戻ってます。よくよく見ると、selfで指してるClassのポインタが違います。
このクラスは、別のところでinitされて呼ばれ、終わったらdismissしてるのですが、そうです、initした回数分だけオブジェクトが残っていて、全部で受信してるようでした。
そのためpostNotificationを受けているためでした。
- (void)viewWillDisappear:(BOOL)animated
{
[ self removeNotificationObserver ];
}
とビューを閉じる前にNotificationの登録を削除してあげることで解決しました。
とちょっと不安はあるものの、一旦は解決です。