NSManagedObject失败isKindOfClass测试

时间:2015-01-01 20:39:04

标签: ios objective-c core-data restkit

我有一个NSManagedObject。当我创建一个实例时,它意外地失败了isKindOfClass方法。

NSEntityDescription *entity = [NSEntityDescription entityForName:@"DayModel" inManagedObjectContext:context];
DayModel *day = [[DayModel alloc] initWithEntity:entity insertIntoManagedObjectContext:context];

if ([day isKindOfClass:[DayModel class]]) {
    NSLog(@"True");
} else {
    NSLog(@"False");
}

输出:

False

我添加了以下代码:

Class objectClass = [day class];
Class classClass = [DayModel class];

在调试器中查看它是我发现的:

enter image description here

打印classClass打印" DayModel的说明。"

我不确定这是否相关,但DayModel是在Swift中实现的。


更新

这在我的测试类中失败了,但在iOS应用程序中没有。问题似乎与this issue类似。但是,我已经将所有类别添加到测试目标中,但它仍然失败。

3 个答案:

答案 0 :(得分:5)

我遇到了同样的问题。

我的案例中的问题实际上并不是我错过了测试项目中的源文件,正如您在更新中提到的链接:isKindOfClass returning NO unexpectedly

根本原因是由于太多源文件具有相同的类。在您的测试目标中,您可能对包含您的应用程序的目标具有目标依赖性,即您已经包含源文件。

因此,请确保从'编译源'中删除包含您在isKindOfClass中使用的类的源文件。对于“构建阶段”中的测试目标标签。

(在您的情况下删除DayModel.m)

我在这里找到了解决问题的方法: isKindOfClass and NSStringFromClass disagree about UIApplicationDelegate

似乎当具有相同类的多个源文件时,isKindOfClass具有奇怪的行为,因为它看不到这两个类是相同的。

答案 1 :(得分:4)

几个小时以来我一直在反对这个,我在网上找到的只是目标。结果我没有设置" Class"在xcdatamodeld编辑器中的字段,它仍然是" NSManagedObject"什么时候它应该是班级的名字......

检查以确保班级名称同时包含在"名称"字段和"类"数据模型检查器(Cmd-Opt-3)中的字段。

答案 2 :(得分:0)

对于托管对象,最好使用这种方式检查类:

if ([object.entity.name isEqualToString:NSStringFromClass(MyManagedObjectSubclass.class)]) {

}