找出isMemberOf等效于Objc运行时类类型

时间:2014-07-22 14:58:04

标签: objective-c

当我引用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

2 个答案:

答案 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];