BAD_ACCESS

おもにiOS、ときどき変な電子工作、ガジェット話。

NSNotificationCenter(通知センター)への登録。

これまで異なるクラス間でメソッドを呼び出す際にはdelegateで取り回しをしていたけど、NSNotification(通知センター)を使ったほうが可読性が高まってあとでメンテナンスしやすいというアドバイスをいただいた。

全てのケースに当てはまるわけじゃないけど、確かにソースの中が読みやすくなった。
今回は通知センターを使う上で、最初にやってしまいがちなミスについてのメモ。

通知センターはビューが作られる段階で監視の開始メソッドを呼ぶことが多い。
以下例。

    [[NSNotificationCenter defaultCenter]addObserver:self
                                            selector:@selector(action:) 
                                                name:@"Hoge"
                                              object:nil];

ここで配置した監視をあとでしっかり取り除いておかないと、この監視が生き残ってしまう。
生き残った監視は、目的の監視にひっかかったときに一斉に呼ばれることになるので複数回メソッドを呼んでしまう恐れがある。

なので、まずはdeallocにしっかりと監視を取り除くためのメソッドを書く。

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    //省略
}

もし監視の設定がViewDidLoadじゃなくて複数回呼ばれる恐れのあるところ(例えばViewWillAppear)なら監視の設定をする前にこれまでの監視を取り除いてやればOK

  [[NSNotificationCenter defaultCenter] removeObserver:self];
    [[NSNotificationCenter defaultCenter]addObserver:self
                                            selector:@selector(action:) 
                                                name:@"Hoge"
                                              object:nil];