了解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不是弱引用,这样可以防止坏内存访问
阅读量
loading...