load和initialize

NSObject中有两个方法:load和initialize

1、load方法

对于load方法,当Objective-C运行时加载类或分类时,会调用这个方法(在main函数前:main.m里的mian函数);通常如果我们有一些类级别的操作需要在加载类时处理,就可以放在这里面,如为一个类执行method swizzling操作。

load消息会被发送到动态加载和静态链接的类和分类里面。不过,只有当我们在类或分类里面实现这个方法时,类/分类才会去调用这个方法。

在类继承体系中,load方法的调用顺序如下:

①一个类的load方法会在其所有父类的load方法之后调用

②分类的load方法会在对应类的load方法之后调用

即 load 顺序:super → self → category

在load的实现中,如果使用同一库中的另外一个类,则可能是不安全的,因为可能存在的情况是另外一个类的load方法还没有运行,即另一个类可能尚未被加载。另外,在load方法里面,我们不需要显示地去调用[super load],因为父类的load方法会自动被调用,且在子类之前。

在有依赖关系的两个库中,被依赖的库中的类其load方法会优先调用。但在库内部,各个类的load方法的调用顺序是不确定的。

2、initialize方法

当我们在程序中向类或其任何子类发送第一条消息前,runtime会向该类发送initialize消息(load方法里发送消息也会调用)。runtime会以线程安全的方式来向类发起initialize消息。父类会在子类之前收到这条消息。父类的initialize实现可能在下面两种情况下被调用:

子类没有实现initialize方法,runtime将会调用继承而来的实现

子类的实现中显示的调用了[super initialize]

如果我们不想让某个类中的initialize被调用多次,则可以像如下处理:

+ (void)initialize{
    if(self== [Person self]) {
        //  自己的操作

    }
}

因为initialize是以线程安全的方式调用的,且在不同的类中initialize被调用的顺序是不确定的,所以在initialize方法中,我们应该做少量的必须的工作。特别需要注意是,如果我们initialize方法中的代码使用了锁,则可能会导致死锁。因此,我们不应该在initialize方法中实现复杂的初始化工作,而应该在类的初始化方法(如-init)中来初始化。

另外,每个类的initialize只会被调用一次。所以,如果我们想要为类和类的分类实现单独的初始化操作,则应该实现load方法。

注:引用博客

你可能感兴趣的:(load和initialize)