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发布通知时,同样的概念也有效,但这不重要,对吗?
答案 0 :(得分:128)
您的一位订阅者已被取消分配。请务必在dealloc中调用[[NSNotificationCenter defaultCenter] removeObserver:self]
(如果不是更早)。
答案 1 :(得分:10)
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) {
...
}
我必须进行一些重构以使其以正确的方式工作。