2011-04-14 212 views
62

一个UIViewController将自身添加到默认中心:后导致 “EXC_BAD_ACCESS” 异常

[[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

究竟它在哪里崩溃? – Till 2011-04-14 19:47:03

+3

在你的场景中添加'[[NSNotificationCenter defaultCenter] removeObserver:self]'到' - (void)dealloc {}'方法可能会为你解决这个问题。它为我工作;我遇到了同样的问题。祝你好运! – nodebase 2014-09-22 02:05:54

回答

128

您的一位用户已被释放。确保在你的dealloc中调用[[NSNotificationCenter defaultCenter] removeObserver:self](如果不早)。

+1

最有可能是正确的 - 常见的错误。 +1 – Till 2011-04-14 19:49:02

+3

谢谢,我刚刚意识到我的错误(看完这个和研究了四个小时)。呼叫发布后我试图引用的对象。调试器使它看起来像是在引发EXC_BAD_ACCESS异常的地方。 – 2011-04-14 19:51:45

+4

@Paul:僵尸工具对调试这类问题真的很有帮助。 – Sven 2011-04-14 19:59:51

9

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发生。

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

+1

是的,刚刚发现这个我自己,我已经把NULL作为选择器打算它是暂时的,就像噢让我去创建该方法,然后我忘了去更新选择器参数后面(DOH)和是,EXC_BAD_ACCESS结果。 – 2014-10-20 14:52:56