美文网首页
load 和initialize方法

load 和initialize方法

作者: 你weixiao的时候很美 | 来源:发表于2019-02-08 20:49 被阅读50次

    参考:
    Objective-C +load vs +initialize
    《Effective Objective-C 2.0》 第51条: 精简initialize与load的实现代码

    1.简介

    有时候类必须先执行某些初始化操作,才能正常使用。继承自Objective-C的类有2个方法,可以用来实现这种初始化操作。load方法 和 initialize方法。

    2.load方法

    谁会调用
    对于加入运行期系统的类和分类会调用load方法,而且仅调用一次。

    调用时机
    当包含类或分类的程序库载入系统时,会执行此方法,iOS通常是在应用程序启动的时候。 对于Mac OS,可以使用动态加载的特性,在应用程序启动后再加载程序库。

    调用顺序
    在执行子类的load方法之前,必定会先执行所有超类的load方法。

    分类和类都实现了load方法,会先调用类里的,再调用分类里的。

    对于某个程序库,无法判断出其中各个类的载入顺序,所以在load方法中使用其他类不安全。

    调用方式
    load方法是直接通过函数的内存地址方式调用的,不是通过消息发送方式调用的。所以不遵守那套继承规则。

    用途
    应用程序在执行load方法的时候会阻塞,所以load方法中不要包含繁杂的代码。

    真正用途仅用于调试程序。

    3.initialize方法

    调用时机
    initialize方法是懒加载的。 是在应用程序首次用该类之前调用。

    调用方式
    runtime使用发送消息 objc_msgSend 的方式对 +initialize 方法进行调用,如果某各类未实现,会运行超类的实现代码。

    因为initialize遵守覆写规则,如果需要类的initialize方法中的代码只执行一次,可以加判断

    + (void)initialize {
      if (self == [ClassName self]) {
        // ... do the initialization ...
      }
    }
    

    调用特点
    当initialize方法调用的时候,运行期系统处于正常状态,可以调用任何类的任何方法。

    相关文章

      网友评论

          本文标题:load 和initialize方法

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