category
Category的基本原理?
在编译期会把Category中的方法、属性、协议 打包成一个category_t的结构体,在运行时会把每个category_t中的方法、属性、协议添加到原类的class_rw_t中。
Category 可以添加+load方法吗?执行顺序?
当然可以添加,但是不会覆盖原类的+load方法。
1.先调用类的+load
按照编译先后顺序调用(先编译,先调用)
调用子类的+load之前会先调用父类的+load
2.再调用分类的+load
按照编译先后顺序调用(先编译,先调用)和继承没有关系。
Category 和 Extension的区别?
Category是运行时才把数据添加到类的结构中,而Extension中的方法原类中没有区别,编译器就加载到了类的结构中。
Category 为是否能添加成员变量?Category 添加属性要注意什么?
不可以添加成员变量,因为成员变量存储在class_ro_t这张表里,这张表是只读的不能在运行时修改,而且category_t这个结构体中没有储存成员变量的list。但是可以根据关联对象实现类似的效果。
可以添加属性到类的属性列表中, 但是没有实现set 和 get方法,只是声名。同样可以通过运行时关联对象,动态为类实现set和get方法。
objc_setAssociatedObject(obj,@selector(getter),value,OBJC_ASSOCIATION_RETAIN_NONATOMIC)objc_getAssociatedObject(obj,@selector(getter))
@selector(getter)方法地址作为key把对应的属性value存储到一个全局的AssociatedManager中。
image
如有错误或者新的见解欢迎在评论区约谈...
作者:switer_iOS
链接:https://www.jianshu.com/p/8d3da221141d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。