在iOS上(使用Xcode 4,iPad Simulator 4.3)我有一个“文章”实体和一个“作者”实体。连接这两者的关系有两种(一篇文章有“作者”关系[可选,多对],作者也有“文章”[可选,多对])。
如果我从空数据库开始(从头开始,从模拟器中删除应用程序并再次进行调试)。它工作正常,我可以添加数百个项目到数据库没有问题。
但是如果我首先向数据库中添加一些项目然后停止应用程序(按主页按钮或不按)并再次启动(再次点击调试按钮)数据就在那里,我可以“读取”数据,我可以可以将数据添加到其他实体。但是,当我添加新作者(而不是文章)时,有时在我的“Author.m”类(它是NSManagedObject的子类)中,此按钮停止在此函数的第二行:
- (void)addArticlesObject:(Article *)value {
NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
[self willChangeValueForKey:@"articles" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
[[self primitiveValueForKey:@"articles"] addObject:value];
[self didChangeValueForKey:@"articles" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
[changedObjects release];
}
没有控制台中的任何消息(debuger输出),如果我前进,我将被发送到__CFTypeCollectionRetain
,然后获得EXC_BADACCESS。
这最后一步并不总是一样,有时它只是不会返回而且CPU达到100%(50%实际上它是双核机器)直到我点击停止或杀死“应用程序”进程(xcode响应很好) 。
任何想法发生了什么?
答案 0 :(得分:1)
你可能正在研究由双边对多关系的副作用引起的无限循环,例如:当您向Article
对象添加Author
对象时,会导致Article
对象添加另一个Author
实例,而该实例又会添加另一个Article
等等。 ..
这不会产生任何立即错误,因为很长的循环通常是代码的一部分。您收到的错误表明您在Core Foundation对象中遇到某种溢出情况,该对象保留了集合(数组,字典,集合)对象。
检查所有自定义访问器的副作用,以确保没有触发循环。您可以将日志语句放在访问器中以查看它们何时被调用。那会让你看到循环。
答案 1 :(得分:0)
似乎问题是自定义托管对象类与数据模型不同步的结果。显然我改变了关系的to-many或optional属性,并没有重新生成自定义类。现在问题已经消失。