FFPerson:消息转发的动态流程分析(上)
2024-01-20 03:13:44
引言
在Objective-C中,消息转发是一个复杂而强大的机制,它允许对象在运行时动态地响应消息。消息转发过程是消息从发送者对象传递到接收者对象的关键过程,而FFPerson类中的likeGirls方法未实现却能被调用则正是消息转发机制在起作用。
消息转发的基本原理
消息转发遵循一个简单的三步流程:
- 消息查找: 当一个对象收到一条消息时,编译器首先会检查该对象是否实现了该消息。如果未实现,则继续执行第2步。
- 动态方法解析: 编译器将消息转发给一个名为resolveInstanceMethod:的特殊方法。这个方法负责查找一个可以处理该消息的方法。如果找到,则继续执行第3步。
- 消息转发: 编译器将消息转发给resolveInstanceMethod:找到的方法。如果未找到,则触发一个错误。
FFPerson类的likeGirls方法分析
在FFPerson类的例子中,我们虽然没有实现likeGirls方法,但编译器仍然能够找到并调用它。这是因为Objective-C采用了动态绑定机制,即方法的绑定是在运行时进行的,而不是编译时。
具体来说,当我们调用FFPerson的likeGirls方法时,编译器首先检查FFPerson类是否实现了该方法。由于未实现,编译器会动态调用resolveInstanceMethod:方法。该方法会检查FFPerson的父类(NSObject)是否实现了likeGirls方法。由于NSObject也没有实现,resolveInstanceMethod:方法会返回nil。
但是,Objective-C还有一个名为forwardingTargetForSelector:的特殊方法。这个方法允许对象将消息转发给另一个对象。在FFPerson的例子中,forwardingTargetForSelector:方法会返回nil,这意味着FFPerson不会将消息转发给其他对象。
最后,由于消息转发过程没有找到合适的处理方法,编译器会触发一个错误。
总结
FFPerson的likeGirls方法未实现却能被调用,是因为Objective-C中的消息转发机制。消息转发允许对象在运行时动态地响应消息,但前提是对象实现了resolveInstanceMethod:和forwardingTargetForSelector:方法。否则,消息转发将失败并触发错误。