我正在尝试用一些iPhone核心数据代码调试一个非常邪恶的问题。
设置是这样的:我有一个线程,用于轮询Web服务并通过NSNotification
将结果发送到主线程(在userDict
传递,一串字符串和{{ 1}}为s)。我正在使用Tim Hatcher的notification library传递给主线程。
NSNumber
主线程接收userDict,然后继续提取其值并将它们插入到新的托管对象中。到目前为止一切都很好。
然而,我遇到了这个问题,但不是立即。在线程将结果发布到主线程并将新对象保存到上下文中之后,我可以执行一系列操作(包括NSDictionary* userDict = [Message userDictFromXML:el];
if (userDict != nil)
{
[[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:@"InsertMessage" object:nil userInfo:userDict];
}
和一些关系分配),这会导致{ {1}}尝试访问获取的托管对象的某个属性时。
另一个有趣的事情是,我可以让问题消失。我可以通过在线程中放置一个NSFetchRequest
,然后将其放入EXC_BAD_ACCESS
并将其发布到主线程中以保存到托管对象中。如果我在接收线程中收到值后立即通过创建新的[userDict retain]
来防止对象相互关联,那么它仍然会在没有NSNotification
的情况下崩溃。
NSString
是什么给了???
答案 0 :(得分:2)
所以问题实际上是属性进入托管对象,对吧?保留修复东西的原因是因为该字典永远不会被释放,这意味着其他任何过度释放你的对象都能够在没有崩溃的情况下这样做,并且最后你有一个带有错误指针的字典(因为你的对象)已被释放)。
如果您有Snow Leopard,请尝试启用NSZombieEnabled并使用ObjectAlloc工具工具。当僵尸被释放后,您可以单击并查找保留和释放对象的所有位置的列表。
答案 1 :(得分:0)
听起来我需要保留对象,同时将它们从Dict添加到ManagedObject。我怀疑在通过通知发送之前添加保留是过度保留,但是你错过了另一方的保留,所以它正在平衡。