调度到'self'和'super'究竟是如何工作的?



请帮助我弄清楚目标C:中的实例方法

  • 可以在内部向selfsuper发送消息
    • 两者都将消息分派给调用对象,但使用不同的实现
    • 如果您的超类调用self上的方法,它将[执行]您的实现(如果存在)

第3讲,斯坦福大学,Objectve-C课程

好了,现在实际上可以理解这个问题了:

假设您有一个具有方法doSomethingdoSomethingElse的类Foo,并且您创建了Foo的一个子类Bar

Bar的实现中,如果您想调用doSomething,您可以执行[self doSomething][super doSomething]

  • [super doSomething]将使用doSomething的超类实现——特别是Foo的实现
  • [self doSomething]将使用类本身对doSomething的实现——也就是Bar的实现。注意,如果Bar实际上没有覆盖doSomething,那么[self doSomething]最终将调用超类的实现

至于如果一个超类在self上调用一个方法会发生什么,假设Bar覆盖doSomething,但不覆盖doSomethingElse,并且假设doSomethingElse看起来像这样:

- (void)doSomethingElse
{
    [self doSomething];
}

如果您在Foo *aFooBar *aBar上调用doSomethingElse会发生什么?[aFoo doSomethingElse]的结果很清楚:它执行[self doSomething],其中selfFoo,因此将执行FoodoSomething的实现。

但当你执行[aBar doSomethingElse]时,事情会变得有趣,这也是Paul的目的。由于Bar不会覆盖doSomethingElseFoo的实现将被调用,而[self doSomething]也会被调用。但这一次,selfBar的一个实例,因此将调用Bar的doSomething实现。

为什么Foo的实现中的[self doSomething]最终会执行来自子类Bar的代码?这是因为消息在Objective-C中是如何调度的。[self doSomething]向对象self发送消息doSomething,并且由self是什么对象来决定执行什么代码。由于在这种情况下,self将是Bar,因此执行BardoSomething的实现。

最新更新