NSNotificationCenter的帖子导致“EXC_BAD_ACCESS”异常

时间:2011-04-14 19:41:53

标签: ios objective-c iphone exc-bad-access nsnotificationcenter

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发布通知时,同样的概念也有效,但这不重要,对吗?

3 个答案:

答案 0 :(得分:128)

您的一位订阅者已被取消分配。请务必在dealloc中调用[[NSNotificationCenter defaultCenter] removeObserver:self](如果不是更早)。

答案 1 :(得分:10)

即使在验证dealloc之后也会发生

EXC_BAD_ACCESS

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

上述问题大部分时间都会解决问题,但显然我的原因是我间接地向观察者添加selector:设置为nil,如下所示:

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

...所以当我发布notificationName的内容时,发生了EXC_BAD_ACCESS

解决方案是发送一个实际指向某个东西的选择器。

答案 2 :(得分:0)

我在 Swift 中遇到了相同的问题。问题出在函数目标上有一个带有默认值的closure参数:

@objc func performFoo(completion: (() -> Void)? = nil) {
   ...
}

在我将closure参数替换为Notification参数之后,它起作用了:

@objc func performFoo(notification: Notification) {
    ...
}

我必须进行一些重构以使其以正确的方式工作。