2010-06-21 103 views
0

这不像一个沉思的问题 - 为什么NSNotificationCenter在发布时会抛出异常?我对iPhone的发展还不熟悉,因此也不了解Cocoa的内涵,所以理解它为什么会很好。为什么NSNotificationCenter在发布时会抛出异常?

我分配defaultCenter一个变量,调用的addObserver:选择:名称:对象,然后释放一个变量,而是调用[通知发布]崩溃的应用程序。我在代码中没有做任何奇怪的事情,因此找出它究竟为什么这么做会很有趣。

任何人遇到这个问题?

+0

相关文档:http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/ – 2010-06-21 18:27:42

回答

5

据我所知NSNotifcation的你不应该分配defaultcenter给一个变量,而是做这样的事情:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showLogin) name:@"IncorrectLogin" object:nil]; 

在片断代码的调用默认中心和注册当前对象一定信息。

然后发布一条消息,通知中心,你可以使用:

[[NSNotificationCenter defaultCenter] postNotificationName:@"IncorrectLogin" object:nil]; 

我用我所有的代码上面,并没有与它的任何问题。

2

应该只有一个默认的通知中心为您的应用程序,所以您的任何类都不应该保留或释放它。你不希望你的通知中心消失在你身上,对吧?

+0

哦,对,所以我分配一个*引用*然后,而不是一个新的对象。啊,这很有道理。谢谢! – 2010-06-21 16:55:56

1

我不认为你自己的对象,因此不应该释放它。

记住NARC:新Alloc,保留,复制。如果你做了其中的一个,你必须释放它。

+2

建议,因为@Jamie是Cocoa开发者的新手:永远不要看着变量的retainCount,它只会导致混淆。有很多有效的原因,保留计数可能与您所期望的不同。只要你遵循适当的内存管理实践,一切都会按照它应该的那样工作。 – kubi 2010-06-21 16:55:09

+0

@ Emil的答案的第二部分,关于AllocRetainCopy,虽然是对的。好建议。 – kubi 2010-06-21 16:56:11

+0

是的,内存管理当然是可怕的 - 我正在非常小心地释放一切,当我完成它 - 保持跟踪属性是非常困难的。谢谢! – 2010-06-21 17:01:01

0

这不是你的发布。

记住NARC规则 - 你只使用释放你带来的东西进入存在:

新 分配 保留或 复制。

NARC。看到?

你在用NSNotificationCenter做什么,你会得到代表默认通知中心的单身人士的副本。这是值得读的单身人士。

相关问题