2012-08-06 88 views
6

我预计[super class]返回超类的类,但我发现,使用这个代码,它返回这个类的类。为什么“[self class] == [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) 
+2

而且,我没有说足够的“class”:“Class class class class class!” – 2012-08-06 11:55:04

+0

你不应该在你自己的类或宏(或任何其他标识符)中使用苹果前缀 – JustSid 2012-08-06 12:03:01

+1

我应该如果我想让他们在我输入NSLog ...时显示:P – 2012-08-06 12:03:52

回答

6

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

+0

谢谢。我只是在努力,假设一个名为“class”的方法应该以某种方式与其余的oop行为不同! – 2012-08-06 12:05:13

+0

我承认在阅读你的问题时我陷入了同样的陷阱。别担心。 – mprivat 2012-08-06 14:57:32

+1

即使你没有覆盖它,如果'self'是覆盖该方法的子类的实例,'[self class]'可能与'[super class]'不同。那么它会调用该子类的实现 – newacct 2012-08-06 17:58:12

2

super是指超类中的方法实现。如果你不覆盖你的类中的方法,你的类和它的父类中的实现是相同的。

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

+1

即使你没有覆盖它,如果'self'是覆盖该方法的子类的一个实例,'[self class]'可能与'[super class]'不一样;那么它会调用该子类的实现 – newacct 2012-08-06 17:58:53

+0

@newacct我知道。 – Sulthan 2012-08-06 18:49:51

0

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

考虑调用方法的实现。它使用(当然)对象指针。一个对象指针是指向一个结构的指针,它具有第一个元素(isa)是一个指向对象类的指针。方法(即,mprivat和Sulthan已经正确陈述,在两种情况下都是相同的)遵循该指针来确定类,即始终调用对象的类。

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

相关问题