Load和Initialize方法对比

Object Runtime

int main(int argc, char * argv[]) {
    
    NSLog(@"%s",__func__);
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
#import "Person.h"

@implementation Person

+ (void)load{
    NSLog(@"%s",__func__);
}

+ (void)initialize{
    [super initialize];
    NSLog(@"%s %@",__func__,[self class]);
}

- (instancetype)init{
    if (self = [super init]) {
        NSLog(@"%s",__func__);
    }
    return self;
}

@end
@implementation Girl

+ (void)load{
    NSLog(@"%s ",__func__);
}

+ (void)initialize{
    [super initialize];
    NSLog(@"%s ",__func__);
}

- (instancetype)init{
    if (self = [super init]) {
        NSLog(@"%s",__func__);
    }
    return self;
}

@end

执行操作

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    Person * p1 = [Person new];
    Person * p2 = [Person new];
    Girl *c1 = [Girl new];
    Girl *c2 = [Girl new];
}
@end

执行结果:

+[Person load]
+[Girl load]
main
+[Person initialize] Person
-[Person init]
-[Person init]
+[Person initialize] Girl
+[Girl initialize]
-[Person init]
-[Girl init]
-[Person init]
-[Girl init]
  • 在没有对类做任何操作的情况下,+load 方法会被默认执行,并且是在 main 函数之前执行的。

  • initialize 方法类似一个懒加载,如果没有使用这个类,那么系统默认不会去调用这个方法,且默认只加载一次;

  • initialize 的调用发生在 +init 方法之前.

  • 在所有超类的+加载方法之后调用类的+ load方法。

  • 在类自己的+ load方法之后调用category + load方法。

  • load和initialize方法都会在实例化对象之前调用,以main函数为分水岭,前者在main函数之前调用,后者在之后调用。这两个方法会被自动调用,不能手动调用它们。
  • load和initialize方法都不用显示的调用父类的方法而是自动调用,即使子类没有initialize方法也会调用父类的方法,而load方法则不会调用父类。
  • load方法通常用来进行Method Swizzle,initialize方法一般用于初始化全局变量或静态变量。
  • load和initialize方法内部使用了锁,因此它们是线程安全的。实现时要尽可能保持简单,避免阻塞线程,不要再使用锁。

你可能感兴趣的:(Load和Initialize方法对比)