我正在尝试使用一些 iPhone Core Data 代码来调试一个非常邪恶的问题。
设置是这样的:我有一个线程来轮询Web服务并通过NSNotification
将其结果发送到主线程(在userDict
中传递,一个一堆字符串和 NSNumber)。我正在使用 Tim Hatcher 的 notification library传递到主线程。
NSDictionary* userDict = [Message userDictFromXML:el];
if (userDict != nil)
{
[[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:@"InsertMessage" object:nil userInfo:userDict];
}
主线程接收 userDict,然后继续提取其值并将它们插入到新的托管对象中。到目前为止一切顺利。
但是我遇到了问题,但不是立即发生。在线程将其结果发布到主线程并将新对象保存到上下文中后,我可以执行一系列操作(包括 NSFetchRequest 和几个关系分配),其结果当尝试访问所获取的托管对象的属性之一时,出现 EXC_BAD_ACCESS
中。
另一个有趣的事情是我可以让问题消失。我可以通过在线程中放置一个 [userDict keep]
来完成此操作,然后将其放入 NSNotification
中以发布到主线程中以保存到托管对象中。如果我在接收线程中收到值后立即创建一个新的 NSString
来隔离对象彼此,这并不重要,如果没有 retain
它仍然会崩溃>.
NSDictionary* userDict = [Message userDictFromXML:el];
if (userDict != nil)
{
[userDict retain]; // NOW THIS WORKS (???)
[[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:@"InsertMessage" object:nil userInfo:userDict];
}
什么给了???
最佳答案
所以问题确实出在托管对象的属性上,对吧?保留修复问题的原因是因为该字典永远不会被释放,这意味着无论其他什么过度释放你的对象都能够在不崩溃的情况下这样做,最后你有一个字典,其中有一个错误的指针(因为你的对象已发布)。
如果您有 Snow Leopard,请尝试在打开 NSZombieEnabled 的情况下运行,并使用 ObjectAlloc 工具工具。当僵尸被释放后,您可以单击并找到该对象被保留和释放的所有位置的列表。
关于iphone - 核心数据: How do I maintain without retain?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2151308/