请帮助我明确目标C中的实例方法:
self
和super
发送消息
self
上调用方法,它将[执行]您的实现(如果存在)答案 0 :(得分:2)
好的,现在实际上可以理解这个问题:
假设您使用方法Foo
和doSomething
创建了一个班级doSomethingElse
,并创建了一个名为Foo
的{{1}}子类。
在Bar
的实施中,如果您想致电Bar
,可以doSomething
或[self doSomething]
。
[super doSomething]
将使用超类的[super doSomething]
实现 - 特别是doSomething
的实现。Foo
会使用类本身的[self doSomething]
实现 - 即doSomething
的实现。请注意,如果Bar
实际上没有覆盖Bar
,那么doSomething
将最终调用超类的实现。至于如果超类在[self doSomething]
上调用方法会发生什么,让我们说self
会覆盖Bar
,但不会覆盖doSomething
,让我们说{{} 1}}看起来像这样:
doSomethingElse
如果您在doSomethingElse
和- (void)doSomethingElse
{
[self doSomething];
}
上致电doSomethingElse
会怎样? Foo *aFoo
的结果很明确:它Bar *aBar
[aFoo doSomethingElse]
为[self doSomething]
,因此self
的{{1}}执行方式将被执行
但是当你做Foo
时,事情会变得有趣,而且正是保罗所得到的。由于Foo
未覆盖doSomething
,因此将调用[aBar doSomethingElse]
的实现,而Bar
将执行doSomethingElse
。但是这一次,Foo
是[self doSomething]
的一个实例,因此将调用self
的doSomething实现。
为什么在Bar
的实现中Bar
最终会从子类[self doSomething]
执行代码?这是因为在Objective-C中如何分派消息。 Foo
将消息Bar
发送到对象[self doSomething]
,由doSomething
对象来决定执行哪些代码。由于self
,在这种情况下,self
,self
的{{1}}执行将被执行。