OC语法 Category底层结构

用途
  • 为已有类添加额外的实例方法、类方法,属性,协议,或通过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 关联对象 实现原理
OC语法 Category底层结构_第1张图片
image.png
Category 和Class Extension 的区别
  • Class Extension 是在编译后合并到类中。
  • Category 是runtime 运行时 合并到类中。

你可能感兴趣的:(OC语法 Category底层结构)