iphone - 核心数据: How do I maintain without retain?

标签 iphone objective-c cocoa core-data nsnotifications

我正在尝试使用一些 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/

相关文章:

iphone - PushViewController 导致黑屏

iphone - 如何使用 RaptureXML 和 AFNetworking 在 UITableView 上动态显示解析的 XML 内容?

iphone - 尝试使用 CAAnimationGroup 放大和缩小 UIButton 时出现问题

objective-c - 如何将可抛出的 Swift 初始化程序与 Objective-C 代码桥接?

c++ - 如何在 C++ 应用程序中处理指向 Objective-C 对象的指针

cocoa - 如何将字符串写入文本文件而不删除/替换原始文件中的任何单词?

iphone - 细胞背景及配件

ios - 动态删除元素时如何使用自动布局?

objective-c - UILabel 调整高度不起作用

ios - 未找到 init 的实例方法(返回类型默认为 'id' )