Category的实现原理

2020-06-30  本文已影响0人  39Coding

Category的实现原理。

Category底层结构.jpg Category加载过程.jpg

Category和Class Extension的区别是什么?

Category中有load方法吗?load方法是什么时候调用的?load方法能继承吗?

load、initialize方法的区别是什么?它们在Category中的调用的顺序?以及出现继承时它们之间的调用过程?

load是根据函数地址直接调用
initialize是通过objc_msgSend调用

loadRuntime加载(所有参与编译的)类、分类的时候调用,只会调用1次
initialize是类第一次接收到消息的时候调用,每一个类只会调用initialize一次,但父类的initialize方法可能会被调用多次(例如:子类和子类的分类都没有实现initialize方法时就会去调用父类的initialize方法)

load
先调用类的load
先编译的类,优先调用load
调用子类的load之前,会先调用父类的load
再调用分类的load
先编译的分类,优先调用load

initialize
调用父类的initialize(初始化)
再调用子类的initialize(初始化)

可能最终调用的是父类的initialize(子类没有实现initialize

Category能否添加成员变量?如果可以,如何给Category添加成员变量?

objc_AssociationPolicy对应表.jpg Runtime关联对象关系图.jpg
上一篇 下一篇

猜你喜欢

热点阅读