美文网首页
Category 的 本质

Category 的 本质

作者: 化二缺 | 来源:发表于2020-04-21 11:20 被阅读0次
    • Category的实现原理,以及Category为什么只能添加方法不能添加属性 ?
      category的底层结构是struct category_t 里面包含了基本的 类方法、实例方法、协议信息、成员变量、当程序运行的时候,利用运行时机制将类方法、实力方法、协议信息等合并到原来的类中。


      Category的底层.png
    1. 属性需要自己实现get /set
    2. 多个Category中的方法协议等 会合并到一个数组中 再添加到对应类
    3. memmove memcpy
    4. 如果 Category 中写一个和对应的类一样的方法 实际上不是覆盖 是抢先了
    5. 上面的两个方法会把 Category中的方法放到类的方法数组的前面 所以是先 找到 Category中的方法
    #import "Person+morefun.h"
    
    @implementation Person (morefun)
    //Category is implementing a method which will also be implemented by its primary class
    -(void)run2{
        //如果主要类里面写了这个方法 会有以上警告
        //如果相同会放到一起  haha, eat, run, run, speak, 不知道为什么
        //如果不一样 就是按顺序 run2, haha, eat, run, speak,
    }
    @end
    

    +load 方法

    • 这个方法是在程序启动的时候就要加载 所以这个会影响app启动速度
    • 之前某个公司的程序猿特别喜欢写+load方法,app启动超级慢,客户常常骂娘,也是无语。
    • objc-os 有个 call_load_methods();
    • call_load_methods 里面先 call_class_loads() 然后再 call_category_loads();
    • 类里面的load 和分类里面的load都会执行
    • 底层是用SEL_load 调用的 所以分类和类里面的load 都会执行 分类的在前

    +(void)initialize

    • 当类第一次接受到消息时候回调用 一次
    • 现在都不用这个方法了
    • 会先调用父类的再调用子类的
    • 如果之前已经调用过initialize,就不会再进行初始化
    • 如果分类中有initialize 就只会调用分类的initialize
    • 底层是通过 objc_msgSend 调用 所以找到谁调用谁

    相关文章

      网友评论

          本文标题:Category 的 本质

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