• ios学习笔记——RunTime


    Objective—C是面向运行时的语言,就是说它会尽可能的把编译和链接时要执行的逻辑延迟到运行时。这就给你很大的灵活性,你可以按需要把消息重定向给合适的对象,你甚至可以交换方法的实现。最重要的还是消息机制。

    C语言使用“静态绑定”,在编译期就能决定运行时所应调用的函数。

    在Objective-c中,如果向某对象传递消息,那就会使用动态绑定机制来决定需要调用的方法。对象接收到消息之后,究竟该调用哪个方法则完全于运行期决定,甚至可以在程序运行时改变。这些特性使得Objective-c成为一门真正的动态语言。

    id returnValue = [someObject messageName:parmeter];

    给哪个对象发送消息,该对象称为接收者;调用的方法叫做选择子;选择子和参数合起来称为“消息”。

    编译器看到此消息后,将其转换为一条标准的C语言函数:

    void objc_msgSend(id self, SEL cmd, ...);

    该函数参数是可变的,第一个参数代表接收者,第二个参数代表选择子,之后的参数就是方法的里面参数。

    objc_msgSend函数会根据接收者与选择子的类型来调用适当的方法。为了完成此方法操作,该方法需要在接收者所属的类中搜寻其“方法列表”,如果能找到与选择子名称相符的方法,就跳至其实现代码。若找不到,那就沿着继承体系继续向上查找,等找到合适的方法再跳转。如果最终还是没有找到相符的方法,那就执行“消息转发”操作。

    objc_msgsend会将匹配结果缓存在“快速映射表”里面,每个类都有这么一块缓存,如果之后发送相同的消息,执行会很快的。

    摘抄《Effective Objective_c2.0 编写高质量ios与OS X代码的52歌有效方法》

  • 相关阅读:
    分治
    递归
    java三大特性之封装
    Java基础知识
    puk2367 拓扑排序
    puk1251 最小生成树
    puk1521 赫夫曼树编码
    DOSbox简单运行操作
    Mybatis初学经验----------------(2)
    mysql存储引擎MyISAM和InnoDB的区别
  • 原文地址:https://www.cnblogs.com/sjzlovecj/p/5370078.html
Copyright © 2020-2023  润新知