为什么“[self class] == [super class]”?
问题描述:
我预计[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)
答
[super class]
调用当前实例的super
方法(即self
)。如果自我有一个被覆盖的版本,那么它会被调用,它会看起来不同。由于您不覆盖它,因此致电[self class]
与致电[super class]
相同。
答
虽然通过mprivat和Sulthan答案是技术上是正确的,目前的情况是比较复杂一点(和有趣):
考虑调用方法的实现。它使用(当然)对象指针。一个对象指针是指向一个结构的指针,它具有第一个元素(isa
)是一个指向对象类的指针。方法(即,mprivat和Sulthan已经正确陈述,在两种情况下都是相同的)遵循该指针来确定类,即始终调用对象的类。
其结果是,如果A是B的超类,都调用[self class]
和[super class]
由B的实例调用,返回B类(A的不,什么人可以预期由于缺少替代的! )。
而且,我没有说足够的“class”:“Class class class class class!” – 2012-08-06 11:55:04
你不应该在你自己的类或宏(或任何其他标识符)中使用苹果前缀 – JustSid 2012-08-06 12:03:01
我应该如果我想让他们在我输入NSLog ...时显示:P – 2012-08-06 12:03:52