Load 与 Initialize方法
2017-11-06 本文已影响7人
毅个天亮
Load 与 Initialize方法
1. load方法的调用顺序
大的顺序是 类
> 分类
。
在类中:
1. 按照compile sources的类顺序调用
2. 父类先于子类
各个分类则按compile sources
内的顺序调用。
例如当前工程中compile sources
内容为
MyViewController.m (subclass of ViewController)
MyViewController+category.m
AppDelegate.m
ViewController+category.m
ViewController.m
则, load方法调用顺序为:ViewController
-> MyViewController
-> AppDelegate
-> MyViewController+category
-> ViewController+category
2. 二者区别
+ load
方法在Runtime中的调用方式为(*load_method)(cls, SEL_load)
,load_method是指向load函数的指针,用的是调用函数的方法。
+ load
方法是当类或分类被添加到 Objective-C runtime 时被调用的。
+ initialize
方法是在类或它的子类收到第一条消息之前被调用的,这里所指的消息包括实例方法和类方法的调用。
+ Initialize
方法在Runtime中调用方式为((void(*)(Class, SEL))objc_msgSend)(cls, SEL_initialize)
, 用的是发送消息的方法。
因此一方面如果+ Initialize
方法写在分类中,会覆盖原来的类方法,而+ load
则不会;另一方面,消息发送,子类不实现会从父类中查找,如果一个类有多个子类都不实现+ Initialize
方法,则父类的+ Initialize
方法会被调用多次。因此,Method_Swizzle都会写在+ load
方法中。