Skip to content

+load 与 initialize

jiaxw32 edited this page Jul 28, 2020 · 2 revisions

load 与 initialize 方法实现要尽量精简,在里面设置一些状态,使本类能够正常运行即可,不要执行耗时太久或需要加锁的任务,不要依赖其他类。

load 方法

  • 每个类或分类加入运行时系统时,会调用 load 方法,而且只调用一次
  • 如果分类和所属的类都定义了 load 方法,则先调用类的,再调用分类里的
  • 执行 load 方法时,会先执行超类的 load 方法
  • load 方法与普通方法不同,它不遵守继承规则。如果某个类没有实现 load 方法,不管其各级超类是否实现该方法,系统都不会调用
  • 执行 load 方法时,运行时系统处于脆弱状态,在 load 方法中使用其他类是不安全的

initialize

  • initialize 方法在程序中首次使用该类之前调用,并且只调用一次。它是由运行时系统来调用的,不用通过代码直接调用该方法

  • initialize 是惰性调用的,只有当程序用到了相关的类时,才会调用。如果某个类一直没有使用,那么 initialize 方法也不会执行

  • 运行时系统在执行该方法时,是处于正常状态的,此时可以安全使用并调用任意类中的任意方法。

  • initialize 方法是线程安全的,只有执行 initialize 的那个线程可以操作类或实例。其他线程都要先阻塞,等着 initialize 执行完

  • initialize 方法遵循继承规则,如果某个类未实现它,而其超类实现了,会先运行超类的代码

  • 无法在编译期设定的全局变量,则可以放在 initialize 方法中初始化,initialize 方法通常应该在里面判断当前要初始化的是哪个类,如下所示:

    #import <Foundation/Foundation.h>
    
    @interface EOCBaseClass : NSObject
    @end
    
    @implementation EOCBaseClass
    + (void)initialize {
        if (self == [EOCBaseClass class]) {
            NSLog(@"%@ initialized", self);
        }
    }
    @end
    
    
    @interface EOCSubClass : EOCBaseClass
    @end
    
    @implementation EOCSubClass
    @end

参考资料

Clone this wiki locally