#iOS#HeminWon

initialize 与 load的使用注意

2016-12-06  本文已影响60人  _时光念你

load

+load方法会在程序进入运行期之前调用,而且只会调用一次,但是如果多个分类中都写了该方法,那么所有的都会调用,但是类的load方法会比分类中的方法先调用,而且分类中的调用次序不确定.

AClass.m
+ (void)load{
     [BClass new];
}

BClass.m
+ (void)load
{
    [AClass new];
}

HGBaseClass.h

#import <Foundation/Foundation.h>
@interface HGBaseClass : NSObject

@end

@interface HGSubClass : HGBaseClass

@end

HGBaseClass.m

#import "HGBaseClass.h"
@implementation HGBaseClass

+ (void)load
{
    NSLog(@"%@ initialize",self);
}

@end

@implementation HGSubClass

@end

执行

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        [HGSubClass new];
    }
    return 0;
}
2016-12-06 16:20:02.288723 API_Test[99942:642553] HGBaseClass initialize

initialize

initialize方法也只会调用一次,但是并不代表该方法块只会执行一次(下面示例),这点与load不同.该方法是懒汉式,只会等类用到了才会去调用该方法,而且该方法会在线程安全的环境中运行,无需担心线程安全问题.

接下来我们将HGBaseClass.m文件改成以下:

@implementation HGBaseClass

+ (void)initialize
{
    NSLog(@"%@ initialize",self);
}

@end

@implementation HGSubClass

@end

再次运行

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        [HGSubClass new];
    }
    return 0;
}

2016-12-06 13:57:23.205882 API_Test[72179:559567] HGBaseClass initialize
2016-12-06 13:57:23.302259 API_Test[72179:559567] HGSubClass initialize

+ (void)initialize
{
    // 如果是当前类
    if (self == [HGBaseClass class]) {
        NSLog(@"%@ initialize",self);
    }
}
2016-12-06 14:00:58.196463 API_Test[72918:561964] HGBaseClass initialize

也可以这样:

+ (void)initialize
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSLog(@"%@ initialize",self);
    });
}
上一篇下一篇

猜你喜欢

热点阅读