美文网首页
Load 与 Initialize方法

Load 与 Initialize方法

作者: 毅个天亮 | 来源:发表于2017-11-06 14:41 被阅读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方法中。

    相关文章

      网友评论

          本文标题:Load 与 Initialize方法

          本文链接:https://www.haomeiwen.com/subject/zjjlmxtx.html