为什么“ == ”?
我希望[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)
[super class]
在当前实例(即self
)上调用super
方法。 如果self有一个被覆盖的版本,那么它将被调用,它看起来会有所不同。 由于你没有覆盖它,调用[self class]
与调用[super class]
。
super
指的是超类中的方法实现。 如果不覆盖类中的方法,则类及其超类中的实现是相同的。
[super class]
和[self class]
调用NSObject
定义的相同方法。
虽然mprivat和Sulthan的答案在技术上是正确的,但目前的情况有点复杂(而且很有趣):
考虑到对方法的调用的实现。 它使用(当然)对象指针。 对象指针是指向结构的指针,该结构的第一个元素( isa
)是指向对象类的指针。 class
方法(也就是说,正如mprivat和Sulthan所说的那样,在两种情况下都是一样的)遵循这个指针来确定类,即始终是调用对象的类 。
因此,如果A是B的超类,则两个调用[self class]
和[super class]
调用B的实例,返回B的类( 不是 A,由于缺少覆盖,可能会出现什么! )。