文章目录
调用load方法:
- runtime加载类的时候,通过函数指针直接调用
- 加载类的时候存放到一个数组里,通过函数指针直接调用,并且调用子类的load方法的时候会先调用父类的load方法.
1. +load方法加载过程
1. 准备所有的load方法
先把类的+load方法加入列表(父类优先装入列表)
再把category的+load方法加入列表
1. objc-os.mm -> _objc_init -> load_images
2. prepare_load_methods
3. schedule_class_load
schedule_class_load(cls-getSuperclass());
递归,从基类一直加入到自身的父类
最后再加入自身类
4. add_class_to_loadable_list
- 添加类的+load到一个列表中,如果没有+load方法,直接返回.(+load方法需要自己实现)
5. add_category_to_loadable_list
- 类似上面的添加类中的load方法
- 4 是由类的isa获取元类,然后获取baseMethod中的load方法
- 5 直接获取分类结构体中的classMethod中的方法
2. 执行+load方法
1.call_load_methods
2. call_class_loads
- 先执行类的+load方法
3.call_category_loads
- 再执行category的+load方法
2. 面试题
1. Category中有load方法吗?load方法是什么时候调用的?load方法能继承吗?
- 有load
- load方法在runtime加载类,分类的时候调用
- load方法可以继承,但是一般情况下不会主动去调用load方法,都是让系统自动调用