消息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函数会依据接受者与选择子的类型来调用适当的方法:

  1. 在接受者所属的类中搜寻“方法列表”,找到就跳至实现代码。
    • 同时将匹配结果缓存在**“快速映射表” **(fast map)中。
  • 若找不到,就沿着继承体系向上查找。等找到后跳转。
  • 若还是找不到就执行“消息转发”(message forwarding)

理解消息转发机制

  1. 第一阶段:动态解析
    • 征询接受者,所属的类,能否动态添加方法,来处理“当前这个未知的选择子”
  • 第二阶段:完整的消息转发机制:(此时接受者已经无法动态新增方法来响应选择子了),请求接受者以其他手段来处理与消息有关的调用
    • 首先会询问接受者是否有“备援接受者”,若有消息会转发给“备援接受者”,转发结束
    • 若无,运行期系统会把消息封装到NSInvocation对象中,令接受者设法解决这条消息,继承体系中每个类都有机会处理此调用请求,直到NSObject。如果调用了NSObject类的方法,还会继而调用“doesNotRecognizeSelector”以抛出异常。

流程图:

posted @ 2016-01-14 16:14  孙焱焱  阅读(216)  评论(0编辑  收藏  举报