ios NSNotificationCenter发布导致“EXC_BAD_ACCESS”异常

lzfw57am  于 2023-04-22  发布在  iOS
关注(0)|答案(4)|浏览(188)

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

t0ybt7op

t0ybt7op1#

您的一个订阅者已被释放。请确保在您的释放中调用[[NSNotificationCenter defaultCenter] removeObserver:self](如果不是更早的话)。

moiiocjp

moiiocjp2#

即使在验证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
解决方案是发送一个实际指向某个对象的选择器。

wribegjk

wribegjk3#

我在Swift中也遇到了同样的问题,问题是函数target有一个closure参数,参数的默认值是:

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

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

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

我不得不做一些重构,使它以正确的方式工作。

mwngjboj

mwngjboj4#

对于任何得到此错误并使用async/await的人,请务必检查此其他问题是否可能不是导致https://stackoverflow.com/a/76066999/2828729的原因。
tl;dr:在编写@objc时,选择器和async方法不能很好地结合在一起

相关问题