Objective c 查找具有Objc运行时类类型的等效isMemberOf
当我引用了Objc运行时的类类型时,我如何才能确定这个类是否引用了NSObjectObjective 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
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类]进行比较