Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

まず、現象としては、

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

nmisawa
最近は仕事ではコードを書くことが減ってきてしまいましたが、個人的にはiOS/Mac(Androidはほんと少々)のコードは書き続けています。iOSアプリも数は出してましたが、メンテナンスが大変で今はだいぶ絞ってます。良かったら使ってみてください。 http://appstore.com/twitsong
http://misawa.net
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away