两个类上的isKindOfClass(非实例)

时间:2013-07-26 20:59:09

标签: objective-c cocoa inheritance

名为B的类继承自A(B:A)

[[B class] isKindOfClass:[A class]]

返回NO

操作

[[B new] isKindOfClass:[A class]]

返回YES

所以左调用者必须是一个实例,但是如何对一个类做同样的事情呢?

2 个答案:

答案 0 :(得分:18)

- (BOOL)isKindOfClass:(Class)aClass

确实是一个实例方法(注意 - )并且不适用于类

+ (BOOL)isSubclassOfClass:(Class)aClass

是一种类方法(注意+),这就是你要找的东西。

但是等等! NSObject Class Reference告诉我们“当它是消息的接收者时,仅通过其名称引用类。在所有其他情况下[...]使用类方法。“

所以你将使用:

[B isSubclassOfClass:[A class]] 

答案 1 :(得分:0)

Class就像一个对象,它能够响应许多消息,打印描述以及Class具有类属性。但是类属性指向类本身,这就是为什么如果你做类似的事情:

NSLog(@"%@",[[NSObject class]class]);

你得到“NSObject”。您认为有一个NSObject实例,但您没有实例。

Class会覆盖isKindOfClass:isMemberOfClass:,这就是[[NSObject isKindOfClass: [NSObject class]]返回NO的原因,因为NSObjectClass,而不是一个NSObject个实例。

测试它的方法是在实例上调用方法,或者像已在评论中发布的那样使用Objective-C runtime.