zoukankan      html  css  js  c++  java
  • 消息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”以抛出异常。

    流程图:

  • 相关阅读:
    Drupal忘记管理员密码
    Drupal7新装一个主题时页面白屏,如何设置一个默认主题?
    Drupal7强制把主题恢复到默认主题
    Drupal常用的模块
    网页流量分析系统
    S运算符&&和|| 及其优先级
    Linux crontab命令
    C语言实现文件实时更新
    Linux 查看设置系统语言
    Python沙盒环境配置
  • 原文地址:https://www.cnblogs.com/sunyanyan/p/5130600.html
Copyright © 2011-2022 走看看