iOS 面试题之load和initialize

以main为分界,load方法在main函数之前执行,initialize在main函数后执行

相同点

1 load和initialize都会自动调用,不能手动调用他们

2 子类实现了load和initalize的话,会隐式的调用父类的load和initialize

3 load和initialize方法内部都使用了锁,因此它们都是线程安全的

不同点

1 字类没有实现load方法的话,不会调用父类的load方法,而字类没有实现initialize方法的时候,会调用父类的方法

2 load方法是在类被装进来的时候就会调用,initialize是在类被实例话的时候会调用,并且只会调用一次,是懒加载,如果这个类没有使用,就不会调用initialize方法

在执行load方法之前,会调用load_images方法,用来扫描镜像中的+load符号,将需要调用的load方法的类添加到一个列表中loadable_classes,在这个列表中,会先把父类加入到加载列表,这样保证父类在子类调用load方法

1 父类优于子类调用

2 类优于分类调用

在扫描完load方法加入到待加载方法,会调用call_load_methods,先从loadable_classes调用类load方法

调用完loadable_classes后会调用loadable_categories中分类的load方法,call_category_loads

 

在扫描完load方法加入到待加载方法后,会调用call_load_methods,先从loadable_classes调用类的load方法,call_class_loads;调用完loadable_classes后会调用loadable_categories中分类的load方法,call_category_loads

调用顺序如下:

  1. 父类load先于类添加到loadable_classes列表,通过call_class_loads,调用列表中的load方法,这样父类的load先于类的load执行
  2. loadable_classes为空的时候,查看loadable_classes是否为空,如果不为空则调用call_category_loads加载分类中的load方法,这样分类的load在类之后执行

4. initialize

initialize 只会在对应类的方法第一次被调用时,才会调用,initialize 方法是在 alloc 方法之前调用的,alloc 的调用导致了前者的执行。

initialize的调用栈中,直接调用其方法的其实是_class_initialize 这个C语言函数,在这个方法中,主要是向为初始化的类发送+initialize消息,不过会强制父类先发送。

与 load 不同,initialize 方法调用时,所有的类都已经加载到了内存中。

5. 使用场景

5.1 load

load一般是用来交换方法Method Swizzle,由于它是线程安全的,而且一定会调用且只会调用一次,通常在使用UrlRouter的时候注册类的时候也在load方法中注册

5.2 initialize

initialize方法主要用来对一些不方便在编译期初始化的对象进行赋值,或者说对一些静态常量进行初始化操作



 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值