我有一个我正在测试的类,它使用大量的运行时类型识别(反射)来决定如何表现。
具体来说,我使用Class
获得了给定类型的property_getAttributes
以及一点点魔法。
说解析的类是MyInheritedObject
。然后,我需要检查此类是否继承自公共基类MyBaseObject
。
因此,给定字符串:“MyInheritedObject”,我使用NSClassFromString来获取类实例,如下所示:
NSString *className = @"MyInheritedObject";
Class cls = NSClassFromString(className);
BOOL isSubclass = [cls isSubclassOfClass:[MyBaseObject class]];
这会返回NO
,令人难以置信的令人费解。如果我注销了超类,它看起来应该正常工作:
NSLog(@"Superclass: %@", [cls superclass]);
//logs: Superclass: MyInheritedObject
所以暂时我正在使用字符串比较继续我的工作,但这是一个可怕的hackety-hack,我不能这样离开。
不确定它是否相关,但这是从测试目标发生的,所以有问题的类会被添加到两个目标中。
关于这里发生了什么的任何想法?
答案 0 :(得分:2)
NSString *className = @"MyInheritedObject";
Class indirectClass = NSClassFromString(className);
Class directClass = [MyInheritedObject class];
BOOL isSubclass = [indirectClass isSubclassOfClass:directClass];
如果你这样做,(indirectClass == directClass)
?
答案 1 :(得分:0)
我只能假设您的类层次结构是错误的。使用上面完全相同的代码,我得到了你所期望的YES。您是否尝试过以下操作:
NSLog(@"%@ %@", NSClassFromString(@"MyInheritedObject"), [MyInheritedObject class]);
查看输出是否匹配。您发布的代码很好,因此它必须是MyInheritedObject或MyBaseObject的问题。我会仔细检查你的类层次结构,并确保你在你的类名上使用前缀,只是在他们的命名冲突时(尽管运行时应该在控制台中警告你)
答案 2 :(得分:0)
我有一个类似的问题,其中类型测试(从NSClassFromString获得):
[type isSubclassOfClass:[AKABindingProvider class]]
失败了,这个测试
[type isSubclassOfClass:NSClassFromString(NSStringFromClass([AKABindingProvider class]))]
成功。
在我的情况下,这只发生在Xcode中,当代码在Interface Builder中的“Editor-> Refresh all views”过程中运行时。在应用程序中运行时似乎没有问题。我的代码是iOS8框架的一部分(因此动态链接)。
我想,无论出于何种奇怪的原因,从[X class]获得的类和使用NSClassFromString获得的类都不属于同一继承层次结构。
您是否可以验证从NSClassFromString获取这两个类时,您的测试是否有效?