精简initialize与load的实现代码

NSObject类有两个初始化方法:

1、+(void)load

必定会调用此方法,而且仅调用一次。

当包含类或分类的程序库载入系统时,在iOS平台下,肯定会在此执行。如果分类和其所属的类都定义了load方法,则先调用类里的,再调用分类里的。

在load方法中使用其他类是不安全的。

如果某个类本身没实现load方法,那么不管其各级超类是否实现此方法,系统都不会调用。

load方法务必实现得精简一些,因为整个应用程序在执行load方法时都会阻塞。

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

2、+(void)initialize

会在程序首次用该类之前调用,且只调用一次。

绝不应该通过代码直接调用。

load是没调用类之前就要调用,此方法是只有调用了类才会被调用。

此方法被调用的时候,可以安全的使用并调用任意类中的任意方法,并且是线程安全的。

遵循通常的继承规则。

通常这样实现此方法:

+(void)initialize
{
    if (self == [EOCClass class])
    {
        NSLog(@" initialize ", self);
    }
}

也需要实现得精简一些。

若某个全局状态无法在编译期初始化,则可放在initialize里来做。

#import "EOCClass.h"

static const int kInterval = 10;
static NSMutableArray *kSomeObjects;

@implementation EOCClass

+(void)initialize
{
    if (self == [EOCClass class])
    {
        kSomeObjects = [NSMutableArray new];
    }
}

@end

猜你喜欢

转载自blog.csdn.net/run_in_road/article/details/113176726