美文网首页工作生活
OC语法 Category底层结构

OC语法 Category底层结构

作者: 啊俊吖 | 来源:发表于2019-07-06 17:14 被阅读0次
    用途
    • 为已有类添加额外的实例方法、类方法,属性,协议,或通过runtime 关联对象 间接添加成员变量。
      • 分类内添加属性,只会生成对应的set:get:方法声明,不会生成对应的成员变量和方法实现。
    • 简化代码阅读,分开臃肿的类。
    实现原理
    • Category 在编译后,生成底层C/C++代码后为结构体struct category_t 内部保存着 属性、方法、协议。
    • 经过runtime运行时内部调用方法。将 属性、方法、协议合并到类中。
      runtime运行时内部调用,底层文件为 objc-os.mm
      • objc_init 运行时初始化。
      • map_images 加载模块。
      • map_images_nolock加载模块。
    • objc-runtime-new.mm
      • _read_iamges读取模块。发现分类, _getObjc2CategoryList()获取分类列表。
      • remethodizeClass 重定义类的方法。
      • attachCategory 添加分类。将所有分类内属性列表、方法列表、协议列表分别添加进一个二位数组。后编译的分类添加在最见面。
      • attachList 属性列表、方法列表、协议列表分别调用该方法,重新组合。
        • realloc 重新分配类内对应列表的内存。添加分类内对应列表的长度。
        • momove 将类对应列表向后移动分类内对应列表的长度。
        • momcpy 将分类内对应列表复制到类对应列表,插入在前面。
    runtime 关联对象 间接添加成员变量。
    • 先声明属性.

    • 实现对应属性的set:get:的方法实现。

      • set: 方法内部实现。
      objc_setAssociatedObject(self , @selector([属性名]) ,[属性名],[内存管理方法] )
      
      • get: 方法内部实现。
      objc_getAssociatedObject(self , _cmd )
      
    • 移除所有管理的对象。

      objc_removeAssociatedObject(self )
      
    runtime 关联对象 实现原理
    image.png
    Category 和Class Extension 的区别
    • Class Extension 是在编译后合并到类中。
    • Category 是runtime 运行时 合并到类中。

    相关文章

      网友评论

        本文标题:OC语法 Category底层结构

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