繁体   English   中英

核心数据:如何保持而不保留?

[英]Core Data: How do I maintain without retain?

我正在尝试使用一些iPhone Core Data代码调试一个非常有害的问题。

设置是这样的:我有一个线程可以轮询Web服务,并通过NSNotification将其结果发送到主线程(传入userDict ,一串字符串和NSNumber )。 我正在使用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] ,然后再将其放入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 Instruments工具。 释放僵尸后,您可以单击并找到该对象被保留和释放的所有位置的列表。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM