我遇到了CoreData托管对象的奇怪行为。在我的viewDidLoad方法中,我执行以下操作:
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"uuid = %@", self.imageUUID];
NSFetchRequest *imageFetchRequest = [[[NSFetchRequest alloc] init] autorelease];
[imageFetchRequest setPredicate:predicate];
NSEntityDescription *imageEntity = [NSEntityDescription entityForName:@"Image" inManagedObjectContext:appDelegate.managedObjectContext];
[imageFetchRequest setEntity:imageEntity];
error = nil;
NSArray *array = [[appDelegate managedObjectContext] executeFetchRequest:imageFetchRequest error:&error];
tagImage = (Image *)[array objectAtIndex:0];
assert([tagImage isKindOfClass:[Image class]]);
断言通过。这个特殊的视图是一个TableViewController,在我的cellForRowAtIndexPath方法中,我需要检查一些Image属性。无论何时我访问tagImage的属性,应用程序都会失败,所以我在这个方法中添加了如下的另一个断言:
assert([tagImage isKindOfClass:[Image class]]);
这一次,断言失败了。我不知道是什么让tagImage对象改变类型。
答案 0 :(得分:2)
您确定要保留数组或托管对象吗?可能会发生以某种方式发布,这就是您出错的原因?
答案 1 :(得分:0)
检查您的Image
课程是否包含在您的构建目标中。我见过一个获取请求返回vanilla NSManagedObjects
而不是我自己的自定义子类的实例,因为我没有将该类包含在我当时正在运行的Logic Tests目标中。
顺便说一句,约定规定你应该在你的类名前加上你选择的双字母前缀(在这种情况下就像MZImage),以减少类名冲突的可能性。很可能会遇到类名为Image
的类名冲突。