【发布时间】:2011-02-21 00:07:23
【问题描述】:
当以下代码在 iPhone (ios 3.1) 上运行时,删除后获取的对象计数比删除前少一。但在 iPad (ios 3.2) 上,计数保持不变。这种不一致导致 iPad 崩溃,因为在代码的其他地方,在删除后不久,调用 fetchedObjects 并且调用代码信任计数,尝试访问刚刚删除的对象的属性,导致 NSObjectInaccessibleException 错误(见下文)。一个修复方法是使用该注释掉的调用 performFetch,当执行该调用时,对 fetchObjects 的第二次调用产生与没有它的 iPhone 上相同的结果。我的问题是:为什么 iPad 产生的结果与 iPhone 不同?这是我最近发现并发布的第二个差异。
-(NSError*)deleteObject:(NSManagedObject*)mo;
{
NSLog(@"\n\nNum objects in store before delete: %i\n\n",
[[self.fetchedResultsController fetchedObjects] count]);
[self.managedObjectContext deleteObject:mo];
// Save the context.
NSError *error = nil;
if (![self.managedObjectContext save:&error]) {
}
// [self.fetchedResultsController performFetch:&error]; // force a fetch
NSLog(@"\n\nNum objects in store after delete (and save): %i\n\n",
[[self.fetchedResultsController fetchedObjects] count]);
return error;
}
(完整的 NSObjectInaccessibleException 是:“由于未捕获的异常 'NSObjectInaccessibleException' 而终止应用程序,原因:'CoreData 无法满足 '0x1dcf90 的错误
【问题讨论】:
-
更新:我在 Apple Dev 论坛上收到了一个有趣的回复。各位专家可能有兴趣。如果我能弄清楚他的建议,我会试试这个。 "尝试向您的 FRC 委托添加一个空的 -controllerDidChangeContent: 方法。- Ben"
-
Ben 的建议解决了这个问题。我只是向我的 FRC 委托添加了一个空的 -controllerDidChangeContent: 方法。当然,现在我必须找出原因。我向 Ben 询问了更多信息,如果他咳嗽了,你会在这里看到。希望这个问题和答案对其他人有用。
-
只需将以下行添加到您的 FRC 委托中:- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { }
-
Apple Dev 论坛的完整解释:“iPad 使用 iPhoneOS 3.2 而 iPhone 3.1。在 3.2 中对 NSFetchedResultsController 进行了许多改进,但不幸的是,对代表的要求产生了副作用实际实现一个(任何一个)委托方法来获得主动变更跟踪。”