当我引用Objc运行时的类类型时,如何判断该类是否引用了NSObject?
Class aClass = [NSArray class];
Class aSuperClass = class_getSuperclass(aClass); // Points to NSObject
// What's the best way to test at runtime whether aSuperClass is pointing
// to an NSObject type?
BOOL isNSObjectClass = [aSuperClass isMemberOfClass:[NSObject class]]; // This returns NO
答案 0 :(得分:1)
你混淆了课程和元课程。
将其煮沸,这:
[[NSObject class] isMemberOfClass:[NSObject class]]
...正确返回NO
,因为包含NSObject
信息的元类本身不是NSObject
的实例。相反,这:
[[NSObject new] isMemberOfClass:[NSObject class]]
...将返回YES
,因为您创建了NSObject
的实例,而不是检查元类。 元类来自NSObject
,但它本身不是NSObject
的实例。
那么你究竟要测试的究竟是什么?一个类是否来自NSObject
,而没有该类的实例?如果是这样,您可能需要手动走isa
链。 E.g。
- (BOOL)class:(Class)someClass isSubclassOf:(Class)class
{
while(someClass)
{
if(someClass == class) break;
someClass = class_getSuperclass(someClass);
}
return !!someClass;
}
您应该看到:
[self class:[NSObject class] isSubclassOf:[NSObject class]] // YES
[self class:[NSProxy class] isSubclassOf:[NSObject class]] // NO
如果您不介意命名空间含义,甚至可能:
@interface NSObject (ObjectIndicator)
@end
@implementation NSObject (ObjectIndicator)
+ (void)someOldMethodOrOther {};
@end
然后:
[NSProxy respondsToSelector:@selector(someOldMethodOrOther)];
答案 1 :(得分:0)
您可以比较Class
个实例:
BOOL isNSObjectClass = aSuperClass == [NSObject class];