将来跳槽用iOS面试知识准备

iOS底层原理分析之load 和 initialize 的区别?

2019-11-03  本文已影响0人  程序员学哥

+load

objc4源码解读过程:找到源码中的objc-os.mm这个类,根据下面这个步骤进行分析:

_objc_init //运行时加载内容入口

load_images //加载镜像
prepare_load_methods 
schedule_class_load //定制任务,规划一些任务
add_class_to_loadable_list //将class添加到_loadable_list数组中
add_category_to_loadable_list

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

根据源码的分析在调用+load的时候,根据(*load_method)(cls, SEL_load)这个方法能看出在底层是直接找到SEL_load这个方法递归寻找去调用的,。

+initialize

objc4源码解读过程,同样是找到源码中的objc-os.mm这个类,根据下面这个步骤进行分析:

objc-msg-arm64.s
objc_msgSend

objc-runtime-new.mm
class_getInstanceMethod //找到Instance对象的方法
lookUpImpOrNil // 鉴别是否为空
lookUpImpOrForward
_class_initialize
callInitialize //回调
objc_msgSend(cls, SEL_initialize)

根据源码的分析在调用initialize的时候,根据这个方法objc_msgSend(cls, SEL_initialize)能看出在底层是通过消息转发机制来进行实现的。

+initialize+load的本质的区别是:

为什么会有+initialize+load这个两个方法?实际使用场景?
+load可以在这类进行加载的时候默认配置一些属性或者方法,实际在平时的使用场景中,比如App内开屏广告的实现,就可以在+load方法中去加载。这个是在AppDelegate加载代理方法执行之前。
+initialize可以在这类进行加载的时候进行一些操作,比如ViewController的初始化的时在ViewDidLoad之前的处理。

上一篇 下一篇

猜你喜欢

热点阅读