为什么“[self class] == [super class]”?

时间:2012-08-06 11:53:05

标签: ios objective-c class oop superclass

我希望[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]相同的值。

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

super指的是超类中的方法实现。如果不覆盖类中的方法,则类及其超类中的实现是相同的。

[super class][self class]都调用NSObject上定义的相同方法。

答案 2 :(得分:0)

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

考虑对方法的调用的实现。它使用(当然)对象指针。对象指针是指向结构的指针,该结构的第一个元素(isa)是指向对象类的指针。 class方法(也就是说,正如mprivat和Sulthan所说的那样,在两种情况下都是一样的)跟随此指针来确定类,即始终是调用对象的

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