6

我希望[super class]返回超类的类,但是我发现,使用它返回这个类的类的代码。

代码

NSLogObject([self class]);
NSLogObject([super class]);
NSLogObject([self superclass]);
NSLogBool([self class] == [super class]);

输出

[self class]: MainMenuScene
[super class]: MainMenuScene
[self superclass]: CCScene
[self class] == [super class]:[YES]

有人可以解释为什么会这样吗?我希望它返回与[self superclass].

宏:
--------
#define NSLogBool(i) NSLog(@"%s:[%@]", #i, (i) ? @"YES" : @"NO")
#define NSLogObject(o) NSLog(@"%s:[%@]", #o, o)
4

3 回答 3

6

[super class]调用super当前实例(即self)上的方法。如果 self 有一个覆盖的版本,那么它会被调用并且看起来会有所不同。由于您不覆盖它,因此调用[self class]与调用相同[super class]

于 2012-08-06T11:59:47.770 回答
3

super指超类中的方法实现。如果你不重写你的类中的方法,你的类和它的超类中的实现是一样的。

两者都[super class]调用[self class]相同的方法,定义在NSObject.

于 2012-08-06T12:00:23.760 回答
0

虽然 mprivat 和 Sulthan 的答案在技术上是正确的,但目前的情况有点复杂(也很有趣):

考虑对方法的调用的实现。它(当然)使用对象指针。对象指针是指向结构的指针,其第一个元素 ( isa) 是指向对象类的指针。class方法(即,正如 mprivat 和 Sulthan 正确指出的那样,在两种情况下都完全相同)遵循此指针来确定类,即始终是调用对象的类

因此,如果 A 是 B 的超类,则由 B 的实例调用[self class]和调用都返回 B 的类(不是A 的类,由于缺少覆盖,人们可能会期望什么!)。[super class]

于 2012-08-06T12:52:13.697 回答