OC

Category分类

Posted on 2021-01-10,2 min read

了解Category、关联对象的原理

Category的实现原理

  • Category编译之后的底层结构是struct category_t , 里面储存着分类的对象方法、类方法、属性、协议信息
  • 在程序运行的时候,runtime会将Category的数据合并到类信息中(类对象,元类对象中)
  • 在合并过程中,是先根据分类的数量拓展对应的内存,然后将类对象的method_list内存地址往后移动对应的长度,再将分类的method_list拷贝至前面空出的内存区(拷贝顺序按照编译顺序来,越晚编译,内存地址越靠前),所以相同的方法,会先执行分类中的方法(跟继承有本质的区别);

Category和ClassExtension的区别是什么?

  • Class Extentsion在编译的时候,它的数据就已经包含再类信息中
  • Category是在运行时,才会将数据合并到类信息中

Category中的load方法是什么时候调用的?

  • load方法再runtime加载类、分类的时候调用
  • load方法可以继承,但是一般情况下不会主动去调用load方法,都是让系统自动调用。

Category能否添加成员变量?

  • 不能直接添加,但是可以间接实现Category有成员变量的效果
  • 利用runtime实现
    objc_getAssociatedObject(id _Nonnull object, const void * _Nonnull key)
    objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key, id _Nullable value, objc_AssociationPolicy policy)

关联对象

  • 本质
    关联对象的本质
  • 修饰符的含义
    关联对象修饰符
  • 为什么没有weak修饰?
    因为ObjectAssociation指向的_value不是弱引用,这样可以防止坏内存访问

下一篇: KVC原理→

loading...