iOS归纳IOS开发

Category-load方法

2020-10-21  本文已影响0人  越天高

01load方法的基本使用

Category中有load方法吗?load方法是什么时候调用的?load 方法能继承吗?
有load方法
load方法在runtime加载类、分类的时候调用
load方法可以继承,但是一般情况下不会主动去调用load方法,都是让系统自动调用

load、initialize方法的区别什么?它们在category中的调用的顺序?以及出现继承时他们之间的调用过程?
Category能否添加成员变量?如果可以,如何给Category添加成员变量?
不能直接给Category添加成员变量,但是可以间接实现Category有成员变量的效果

+load方法会在runtime加载类、分类时调用

每个类、分类的+load,在程序运行过程中只调用一次

调用顺序
先调用类的+load
按照编译先后顺序调用(先编译,先调用)
调用子类的+load之前会先调用父类的+load

再调用分类的+load
按照编译先后顺序调用(先编译,先调用)

为什么分类中覆盖了原来的load的他原来的load方法还可以正常的调用呢?
通过打印方法列表,发现分类的load却是加到了元类的方法列表里面

2调用原理

objc4源码解读过程:objc-os.mm
_objc_init

load_images

prepare_load_methods
schedule_class_load
add_class_to_loadable_list
add_category_to_loadable_list

call_load_methods
call_class_loads
call_category_loads
(*load_method)(cls, SEL_load)

+load方法是根据方法地址直接调用,并不是经过objc_msgSend函数调用

运行时源码查找load_images->call_load_methods->{
这里面他会先调用类的load方法,再去调用分类的load方法
}
这个顺序和编译顺序没有关系,他是直接找到load的地址进行调用,而调用test对象方法,他会调用分类里面的是因为,他是通过的发消息的机制,根据isa找到类对象,然后再去方法列表寻找这个方法,一旦找到了就执行,不会往下再去寻找了

load的加载流程

03调用顺序涉及继承关系

肯定先调用类的load方法,再去调用分类的,通过分析源码可以看出来,在schedule_class_load时候,他会先将父类的加载进去,真正调用的时候,他会从0开始调用,所有先调用的是父类的load
如果类之间不是继承关系的话,他们之间的调用顺序就跟编译顺序有关了
分类之间的调用关系,也是根据编译顺的不同而调用不同

上一篇下一篇

猜你喜欢

热点阅读