category

2021-07-12  本文已影响0人  J星O海E

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

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

上一篇下一篇

猜你喜欢

热点阅读