在 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];
}
控制台中没有任何消息(调试器输出),如果我向前迈出一步,我将被发送到 __CFTypeCollectionRetain
,然后获得 EXC_BADACCESS 。
最后一步并不总是相同的,有时它不会返回,CPU 会达到 100%(50% 实际上它是双核机器),直到我点击停止或终止“应用程序”进程(xcode 响应良好) 。
有什么想法吗?
最佳答案
您可能正在看到由两侧对多关系的副作用引起的无限循环,例如当您将 Article
对象添加到 Author
对象时,会导致 Article
对象添加另一个 Author
实例,其中依次添加另一篇文章
,依此类推...
这不会立即产生任何错误,因为代码中通常包含很长的循环。您收到的错误表明您在保留集合(数组、字典、集合)对象的 Core Foundation 对象中遇到某种溢出情况。
检查所有自定义访问器是否有副作用,以确保没有触发循环。您可以将日志语句放入访问器中以查看它们何时被调用。这会让你看到循环。
关于iphone - 自定义托管对象间歇性地卡在关系访问器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5809641/