为什么“[自我类] == [超类]”?(Why does “[self class] == [sup

2019-09-20 20:57发布

我期待[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)

Answer 1:

[super class]调用super上的当前实例(即方法self )。 如果自我有一个重写版本,那么它会被调用,它看起来不同。 既然你不重写,调用[self class]是与调用[super class]



Answer 2:

super指的是在超类中的方法实现。 如果不覆盖的方法在您的类,在你的类和它的超类的实现是一样的。

[super class][self class]调用相同的方法,定义NSObject



Answer 3:

虽然通过mprivat和Sulthan答案是技术上是正确的,目前的情况是比较复杂一点(和有趣):

考虑到调用方法的实现。 它使用(当然)的对象的指针。 一个对象指针是一个指针,它指向具有作为其第一元件(一个结构isa )是指向的对象类。 所述class的方法(即,作为mprivat和Sulthan已表示正确地,在这两种情况下非常相同的)遵循此指针以确定类,即,总是类调用对象的

其结果是,如果A是B的超类,这两个调用[self class][super class]由B的实例调用,返回B类( 不是的,什么人可以预期由于缺少替代的! )。



文章来源: Why does “[self class] == [super class]”?