LoginSignup
2
1

More than 5 years have passed since last update.

クラスの中でなぜか複数かメソッドが呼ばれる

Posted at

という現象が起きてしまっていて発見するまで時間がかかったのでメモしておきます。

まず、現象としては、

メソッドは、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の登録を削除してあげることで解決しました。
とちょっと不安はあるものの、一旦は解決です。

2
1
1

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
2
1