NSClassFromString返回一个Class对象,该对象没有正确响应isSubClassOfClass

时间:2011-07-15 16:02:41

标签: objective-c reflection rtti

我有一个我正在测试的类,它使用大量的运行时类型识别(反射)来决定如何表现。

具体来说,我使用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,我不能这样离开。

不确定它是否相关,但这是从测试目标发生的,所以有问题的类会被添加到两个目标中。

关于这里发生了什么的任何想法?

3 个答案:

答案 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获取这两个类时,您的测试是否有效?