web-dev-qa-db-ja.com

NSNotificationCenterの投稿により「EXC_BAD_ACCESS」例外が発生します

UIViewControllerは自身をデフォルトのセンターに追加します:

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

次に、UITableViewデリゲートNSObjectがNSNotificationをポストします。

[[NSNotificationCenter defaultCenter]
 postNotificationName:@"editFood"
 object:self];

実行中にEXC_BAD_ACCESS例外を受け取ります。

defaultCenterはどこかでリリースされますか? UIViewControllerからUIViewControllerに通知を投稿するときに同じ概念が機能しますが、それは問題ではないでしょうか?

62
Paul Jordan

サブスクライバーの1つが割り当て解除されました。 deallocで[[NSNotificationCenter defaultCenter] removeObserver:self]を呼び出してください(そうでない場合)。

128
Ben Scheirman

EXC_BAD_ACCESSは、deallocが次のように存在することを確認した後でも発生する可能性があります。

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self]
}

上記はほとんどの場合問題を解決しますが、明らかに私の原因は、selector:次のようにnilに設定します。

[NSNotificationCenter.defaultCenter addObserver:self
                                         selector:nil
                                             name:notificationName
                                           object:nil];

...そのため、notificationNameEXC_BAD_ACCESS 発生した。

解決策は、実際に何かを指すセレクターを送信することでした。

10
kraftydevil