美文网首页
三、RunTime

三、RunTime

作者: Miss_DQ | 来源:发表于2021-07-14 08:48 被阅读0次

    注:本文集为自己准备面试时,系统复习的笔记,如大家有兴趣,欢迎阅读并指正


    image.png

    对象、类对象、元类对象

    类对象:存储实例方法列表等信息。
    元类对象:存储类方法列表等信息。


    image.png

    消息传递

    void objc_msgSend(self,@selector(class))
    void objc_msgSendSuper(super,@selector(class))

    消息传递流程图

    缓存查找:
    例:给定值是SEL,目标值是对应bucket_t中的IMP?通过哈希查找cache_key_t -> bucket_t
    当前类中查找:
    1.对于已排序好的列表,采用二分查找算法查找方法对应执行函数。
    2.对于没有排序的列表,采用一般遍历进行查找
    父类逐级查找:


    image.png

    消息转发

    image.png

    Method-Swizzing

    方法交换

    动态添加方法

    erformSelector:编译时无该方法,运行时执行该方法

    class_addMethod(self,@selector(test),testImp,@"v@:");
    

    动态方法解析

    @dynamic 运行时给属性添加setter和getter方法

    • 动态运行时语言将函数决议推迟到运行时。
    • 编译时语言在编译期进行函数决议。

    Runtime实战

    • [obj foo]和objc_msgSend()函数之间有什么关系?
      运行时[obj foo]实际执行的是objc_msgSend(self ,@selector(foo));
    • runtime如何通过Selector找到对应的IMP地址的?
      先找当前实例的缓存,如果命中返回,没有返回在类的方法列表中查找,如果没有命中,在逐级查找父类的方法列表。
    • 能否向编译后的类中添加实例变量?
      不能,可以给动态添加的类添加实例变量

    相关文章

      网友评论

          本文标题:三、RunTime

          本文链接:https://www.haomeiwen.com/subject/zzkspltx.html