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方法中。

上一篇下一篇

猜你喜欢

热点阅读