我有一个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];
在调试器中查看它是我发现的:
打印classClass
打印" DayModel的说明。"
我不确定这是否相关,但DayModel是在Swift中实现的。
更新
这在我的测试类中失败了,但在iOS应用程序中没有。问题似乎与this issue类似。但是,我已经将所有类别添加到测试目标中,但它仍然失败。
答案 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)]) {
}