Objective c 查找具有Objc运行时类类型的等效isMemberOf

Objective c 查找具有Objc运行时类类型的等效isMemberOf,objective-c,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

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

您可以比较
实例:

BOOL isNSObjectClass = aSuperClass == [NSObject class];

你混淆了类和元类

把它煮沸,这个:

[[NSObject class] isMemberOfClass:[NSObject class]]
。。。正确返回
NO
,因为包含有关
NSObject
信息的元类本身不是
NSObject
的实例。相反,这:

[[NSObject new] isMemberOfClass:[NSObject class]]
。。。将返回
YES
,因为您创建了
NSObject
实例,而不是检查元类元类从
NSObject
派生而来,但本身不是
NSObject
的实例

那么你到底想测试什么呢?类是否从
NSObject
派生,而不具有该类的实例?如果是这样,您可能需要手动遍历
isa
链。例如

- (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)];

我想您可能对
是类的一种:
(更典型)和
是类的成员:
(更具体,但并不总是一个好主意)感兴趣。所以您可以执行
[对象是类的种类:[NSArray类]]
。这并不能直接解决您的问题,但可能更接近您实际想要实现的目标。谢谢——事实上,我把类和元类混为一谈了。我需要使用someClass==[NSObject类]进行比较