我正在尝试调试一些 iPhone Core Data 代码的一个非常邪恶的问题。
设置是这样的:我有一个线程来轮询 Web 服务并将其结果发送NSNotification
到主线程(传入userDict
、一堆字符串和NSNumber
s)。我正在使用 Tim Hatcher 的通知库传递给主线程。
NSDictionary* userDict = [Message userDictFromXML:el];
if (userDict != nil)
{
[[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:@"InsertMessage" object:nil userInfo:userDict];
}
主线程接收 userDict,然后继续提取其值并将它们插入到新的托管对象中。到现在为止还挺好。
然而,我遇到了这个问题,但不是立即。在线程将其结果发布到主线程并将新对象保存到上下文后,我可以执行一系列操作(包括一个NSFetchRequest
和几个关系分配),这会导致EXC_BAD_ACCESS
尝试访问其中一个获取的托管对象的属性。
另一个有趣的事情是我可以让问题消失。我可以通过[userDict retain]
在线程中放入一个单个的来做到这一点,然后将其放入 aNSNotification
中以发布到主线程中以保存到托管对象中。NSString
只要我在接收线程中接收到值,我是否通过创建一个新的对象来相互防火墙并不重要,没有那个它仍然会崩溃retain
。
NSDictionary* userDict = [Message userDictFromXML:el];
if (userDict != nil)
{
[userDict retain]; // NOW THIS WORKS (???)
[[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:@"InsertMessage" object:nil userInfo:userDict];
}
是什么赋予了 ???