category

作者: J星O海E | 来源:发表于2021-07-12 01:14 被阅读0次

    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

    来源:简书

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

    相关文章

      网友评论

          本文标题:category

          本文链接:https://www.haomeiwen.com/subject/zaolpltx.html