自定义托管对象在关系访问器中间歇性挂起

时间:2011-04-27 19:42:46

标签: iphone ios ipad core-data relationship

在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响应很好) 。

任何想法发生了什么?

2 个答案:

答案 0 :(得分:1)

你可能正在研究由双边对多关系的副作用引起的无限循环,例如:当您向Article对象添加Author对象时,会导致Article对象添加另一个Author实例,而该实例又会添加另一个Article等等。 ..

这不会产生任何立即错误,因为很长的循环通常是代码的一部分。您收到的错误表明您在Core Foundation对象中遇到某种溢出情况,该对象保留了集合(数组,字典,集合)对象。

检查所有自定义访问器的副作用,以确保没有触发循环。您可以将日志语句放在访问器中以查看它们何时被调用。那会让你看到循环。

答案 1 :(得分:0)

似乎问题是自定义托管对象类与数据模型不同步的结果。显然我改变了关系的to-many或optional属性,并没有重新生成自定义类。现在问题已经消失。

相关问题