【问题标题】:Post of NSNotificationCenter causing "EXC_BAD_ACCESS" exceptionNSNotificationCenter 的帖子导致“EXC_BAD_ACCESS”异常
【发布时间】:2011-08-05 20:10:43
【问题描述】:

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

【问题讨论】:

  • 到底是哪里崩溃了?
  • 在你的场景中添加[[NSNotificationCenter defaultCenter] removeObserver:self]-(void)dealloc{} 方法可能会为你解决这个问题。它对我有用;我遇到了和你一样的问题。祝你好运!

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


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    EXC_BAD_ACCESS 即使在验证了 dealloc 存在之后也可能发生,如下所示:

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

    上述方法大部分时间都可以解决问题,但显然我的原因是我间接添加了观察者,并将selector: 设置为nil,如下所示:

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

    ...所以当我用 notificationName 发布一些东西时,EXC_BAD_ACCESS 发生了。

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

    【讨论】:

    • 是的,我自己发现了这个,我把 NULL 作为选择器,打算让它成为临时的,就像哦让我去创建那个方法,然后我忘了去更新选择器参数( DOH),是的,EXC_BAD_ACCESS 结果。
    【解决方案3】:

    您的一个订阅者已被解除分配。确保在你的 dealloc 中调用[[NSNotificationCenter defaultCenter] removeObserver:self](如果不是更早的话)。

    【讨论】:

    • 谢谢,我才意识到我的错误(在看了这个并研究了四个小时之后)。调用释放后我试图引用的对象。调试器只是让它看起来像是抛出 EXC_BAD_ACCESS 异常的地方。
    • @Paul:Zombies 工具对调试这类问题非常有帮助。
    • @Sven 谢谢,我很感激。我实际上尝试过使用一次,但不知道如何使用。我在项目 plist 中添加了一个环境变量,但这不起作用。
    • 我在通知调用后释放该对象我得到 EXC_BAD_ACCESS 我该如何解决这个问题?
    • EXC_BAD_ACCESS 不是异常,是无效的内存访问
    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2016-11-19
    • 2012-10-02
    • 2011-04-14
    相关资源
    最近更新 更多