我有一个正在测试的类,它使用了大量的运行时类型识别(反射)来决定如何行为。
具体来说,我使用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获得时,你的测试将工作吗?