ManagedObject似乎丢失了它的类类型,或者变成了不同类型的对象

时间:2011-01-02 19:35:45

标签: iphone core-data ios4

我遇到了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对象改变类型。

2 个答案:

答案 0 :(得分:2)

您确定要保留数组或托管对象吗?可能会发生以某种方式发布,这就是您出错的原因?

答案 1 :(得分:0)

检查您的Image课程是否包含在您的构建目标中。我见过一个获取请求返回vanilla NSManagedObjects而不是我自己的自定义子类的实例,因为我没有将该类包含在我当时正在运行的Logic Tests目标中。

顺便说一句,约定规定你应该在你的类名前加上你选择的双字母前缀(在这种情况下就像MZImage),以减少类名冲突的可能性。很可能会遇到类名为Image的类名冲突。