Effective Objective-C 2.0 第12条:理解消息转发机制

消息转发两个阶段

  1. 先征询接收者,所属的类,看其是否能动态添加方法,已处理当前这个“未知的选择子”(unknow selector),这叫做动态解析(dynamic method resolution)。
  2. 完整地消息转发机制(full forwarding mechanism)

动态方法解析

对象收到无法解读的消息后,首先调用其所属类的下列类方法:

/*
 * @param SEL 未知的选择子
 * @return BOOL 表示该类是否能新增一个实例方法用以处理此选择子
 */
+ (BOOL)resolveInstanceMethod:(SEL)selector;

假如尚未实现的方法不是实例方法而是类方法,运行期系统就会调用另一个方法:

+ (BOOL)resolveClassMethod:(SEL)selector;

备援接受者

当前接收者还有第二次机会处理未知的选择子,在这一步中,运行期系统会问它:能不能把这条消息转发给其它接收者处理。

- (id)forwardingTargetForSelector:(SEL)selector;

完整的消息转发

  1. 创建NSInvocation对象,把与尚未处理的那条消息有关的全部细节都封装于其中。此对象包含选择子、目标及参数。
  2. 消息派发系统会将NSInvocation对象指派给目标对象,此步骤会调用:
- (void)forwardInvocation:(NSInvocation*)invocation;

这样从子类不命中调用超类,直至NSObject。如果最后调用NSObject类的方法,那么紧接着会抛出异常“doesNotRecognizeSelector”,以抛出异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值