0

我正在尝试调试一些 iPhone Core Data 代码的一个非常邪恶的问题。

设置是这样的:我有一个线程来轮询 Web 服务并将其结果发送NSNotification到主线程(传入userDict、一堆字符串和NSNumbers)。我正在使用 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];
}

是什么赋予了 ???

4

2 回答 2

2

所以问题实际上在于属性进入托管对象,对吗?保留修复问题的原因是因为该字典永远不会被释放,这意味着任何其他过度释放您的对象都能够在不崩溃的情况下这样做,并且最后您有一个带有错误指针的字典(因为您的对象已发布)。

如果您有 Snow Leopard,请尝试在 NSZombieEnabled 开启的情况下运行,并使用 ObjectAlloc 工具工具。当僵尸被释放时,您可以单击并找到该对象被保留和释放的所有位置的列表。

于 2010-01-28T02:22:15.563 回答
0

在我看来,您需要保留对象,同时将它们从字典添加到 ManagedObject。我怀疑在通过通知发送之前添加保留是过度保留,但是您在另一侧缺少保留,因此它正在平衡。

于 2010-01-28T00:48:14.137 回答