Object Runtime

作者: AKyS佐毅 | 来源:发表于2017-01-06 20:51 被阅读48次

    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方法内部使用了锁,因此它们是线程安全的。实现时要尽可能保持简单,避免阻塞线程,不要再使用锁。

    相关文章

      网友评论

        本文标题:Object Runtime

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