【问题标题】:Why does "[self class] == [super class]"?为什么“[self class] == [super class]”?
【发布时间】:2012-08-03 09:23:00
【问题描述】:

我希望 [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)

【问题讨论】:

  • 只是以防我说的“class”不够:“Class class class class class!”
  • 您不应在自己的类或宏(或任何其他标识符)中使用苹果前缀
  • 如果我希望它们在我输入 NSLog 时出现,我应该...:P

标签: ios objective-c class oop superclass


【解决方案1】:

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

【讨论】:

  • 谢谢。我只是在打瞌睡,并假设一个名为“class”的方法应该以某种方式与 oop 的其余部分有所不同!
  • 我承认我在阅读你的问题时陷入了同样的陷阱。不用担心。
  • 即使你没有覆盖它,如果self 是覆盖该方法的子类的实例,[self class] 也可能与[super class] 不同;然后它将调用该子类的实现
  • 我不太明白这个答案。没有super 方法。 super 是一个关键字。
  • @RiazRizvi:他们的意思是“超类对方法的实现”,不用多说。
【解决方案2】:

super 指的是超类中的方法实现。如果你不重写你的类中的方法,你的类和它的超类中的实现是一样的。

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

【讨论】:

  • 即使你没有覆盖它,如果self 是覆盖该方法的子类的实例,[self class] 也可能与[super class] 不同;然后它将调用该子类的实现
【解决方案3】:

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

考虑方法调用的实现。它(当然)使用对象指针。对象指针是指向结构的指针,其第一个元素 (isa) 是指向对象类的指针。 class 方法(即,正如 mprivat 和 Sulthan 正确指出的那样,在两种情况下都非常相同)遵循此指针来确定类,即始终是 调用对象的类

结果,如果A是B的超类,B的实例调用[self class][super class],返回B的类(不是A的,什么可能会因为缺少覆盖而期望!)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2013-11-13
    • 2016-10-02
    • 2014-09-07
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    相关资源
    最近更新 更多