美文网首页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