目标 c - NSClassFromString 返回一个不能正确响应 isSubClassOfClass 的类对象



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

具体来说,我使用property_getAttributes和一点字符串魔术来获得给定类型的Class

假设解析的类是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

因此,暂时我使用字符串比较来继续我的工作,但这是一个可怕的hack,我不能让它这样。

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

你知道这是怎么回事吗?

NSString *className = @"MyInheritedObject";
Class indirectClass = NSClassFromString(className);
Class directClass = [MyInheritedObject class];
BOOL isSubclass = [indirectClass isSubclassOfClass:directClass];

如果你这样做,(indirectClass == directClass) ?

我只能假设你的类层次结构是错误的。使用上面完全相同的代码,我得到你所期望的是YES。

NSLog(@"%@ %@", NSClassFromString(@"MyInheritedObject"), [MyInheritedObject class]);

查看输出是否匹配。你所发布的代码是好的,所以它必须是一个问题与MyInheritedObject或MyBaseObject。我会仔细检查你的类层次结构,并确保你使用前缀在你的类名,只是在一个偶然的机会他们的命名冲突(虽然运行时应该警告你在控制台)

我有一个类似的问题,在类型的测试(从NSClassFromString获得):

[type isSubclassOfClass:[AKABindingProvider class]]

失败,此测试

[type isSubclassOfClass:NSClassFromString(NSStringFromClass([AKABindingProvider class]))]

成功。

在我的情况下,这只发生在Xcode中,当代码在界面生成器中的"编辑器->刷新所有视图"过程中运行时。当在应用程序中运行时,似乎没有问题。我的代码是iOS8框架的一部分(并作为动态链接)。

我猜,不管出于什么奇怪的原因,从[X class]获得的类和用NSClassFromString获得的类不属于同一个继承层次。

你能验证当两个类都从NSClassFromString获得时,你的测试将工作吗?

相关内容

  • 没有找到相关文章

最新更新