美文网首页iOS
Load() +initialize()

Load() +initialize()

作者: 小万叔叔 | 来源:发表于2017-03-11 22:16 被阅读13次

Prepare

  • Load 方法当类被加载到 runtime 的时候就会运行,而且有依据如下两个条件:
    A: 根据Compile Sources 中的顺序来加载。
    B: Category 会在一般类之后。
    C: 有继承关系的会先加载父类。
//Father 
@implementation Father 
+ (void)load {
    NSLog(@"=== father load");
}

+ (void)initialize {
    NSLog(@"=== father initialize");
}
@end

//Son
@interface Son : Father
@end
@implementation Son 
+ (void)load {
    NSLog(@"=== Son load");
}

+ (void)initialize {
    NSLog(@"=== Son initialize");
}
@end
//Father Category
@implementation Father (category)
+ (void)load {
    NSLog(@"=== father category load");
}

+ (void)initialize {
    NSLog(@"=== father category initialize");
}
@end
//Son category
@implementation Son (category)
+ (void)load {
    NSLog(@"=== Son category load");
}

+ (void)initialize {
    NSLog(@"=== Son category initialize");
}
@end

//Compile Source Order
Son.m
Father.m
Son+category.m
Father+category.m

//OutPut
 === father load
 === Son load
 === Son category load
 === father category load
  • Initialize 发生在类第一次初始化时, 遵循以下规律(当然如果load方法里面调用例如 [self Class] 这样的方法,会先调用 initialize。
    A: 有继承关系的如果子类没有实现Initialize ,会调用父类的,也就是说父类的Initialize 可能会被调用2次。
//Father
@implementation Father 
+ (void)initialize {
    NSLog(@"=== father initialize");
}
@end
//Son
@interface Son : Father
@end
@implementation Son 
//+ (void)initialize {
//    NSLog(@"=== Son initialize");
//}
@end
//AppDelegate.m
[Son new]
[Father new]

//OutPut
=== father initialize
=== father initialize

//Resolver
+ (void)initialize {
    if (self == [Father class]){
        NSLog(@"=== father initialize");
    }
}

B: 如果 Category 也重写了Initialize, 会override, 也就是原来类里面的Initialize 不会被调用。

//最上面源码里面的输出
=== father category initialize
=== Son category initialize

适用场景

  • load() 会增加启动时间,不适宜做过多的事情,一般用于简单的运行时方法交换。
  • Initialize() 仅仅用来需要延迟加载一些全局或者静态变量。

相关文章

网友评论

    本文标题:Load() +initialize()

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