消息messaging
消息messaging
理解objc_msgSend
在对象上调用方法用Object-C的术语叫做“传递消息”。
给对象发送消息写法:
id returnValue = [somneObject messageName:parameter];
编译器会将上诉代码转换为:
id = returnValue = objc_msgSend(someObject,@selector(messageName:),parameter);
其中 someObject叫做“接受者”(receiver),messageName叫做“选择子”(selector),选择子和参数合称“消息”
objc_msgSend函数会依据接受者与选择子的类型来调用适当的方法:
- 在接受者所属的类中搜寻“方法列表”,找到就跳至实现代码。
- 同时将匹配结果缓存在**“快速映射表” **(fast map)中。
- 若找不到,就沿着继承体系向上查找。等找到后跳转。
- 若还是找不到就执行“消息转发”(message forwarding)
理解消息转发机制
- 第一阶段:动态解析
- 征询接受者,所属的类,能否动态添加方法,来处理“当前这个未知的选择子”
- 第二阶段:完整的消息转发机制:(此时接受者已经无法动态新增方法来响应选择子了),请求接受者以其他手段来处理与消息有关的调用
- 首先会询问接受者是否有“备援接受者”,若有消息会转发给“备援接受者”,转发结束
- 若无,运行期系统会把消息封装到NSInvocation对象中,令接受者设法解决这条消息,继承体系中每个类都有机会处理此调用请求,直到NSObject。如果调用了NSObject类的方法,还会继而调用“doesNotRecognizeSelector”以抛出异常。
流程图: