美文网首页iOS技术专题iOS开发
OC 中 load 方法和 initialize 方法有什么不同

OC 中 load 方法和 initialize 方法有什么不同

作者: 43b86d3b5040 | 来源:发表于2017-04-08 14:09 被阅读14次
    load

    只要程序启动就会将所有类加载到内存中,放代码区,无论该类有没有被使用到。
    load方法会在当前类加载到内存中的时候由系统自动加载调用,仅会调用一次,如果有继承关系,子类不需要 [super load];调用顺序是先执行父类的load函数再执行子类的load函数。

    initialize

    当前类第一次被使用(创建对象)的时候会被调用,initalize方法也是在整个程序运行过程中只会被调用一次。如果存在继承关系,和load方法一样,不需要super,父类先执行,子类后执行。
    该方法主要用作静态变量的设置并且保证在实例初始化的前提条件必须满足。

    注意

    这两个函数并没有交集,也没有执行的先后顺序,他们各自遵循着自己的调用原则,因此写代码的时候不能有依赖load函数比initialize函数先执行的逻辑。

    @interface Animal : NSObject
    @end
    
    @implementation Animal
    
    + (void)load
    {
        NSLog(@"Animal %s",__FUNCTION__);
    }
    
    + (void)initialize
    {
        NSLog(@"Animal %s",__FUNCTION__);
    }
    
    @end
    
    @interface Dog : Animal
    @end
    
    @implementation Dog
    
    + (void)load
    {
        NSLog(@"Dog %s",__FUNCTION__);
    }
    
    + (void)initialize
    {
        NSLog(@"Dog %s",__FUNCTION__);
    }
    
    @end
    
    //调用
    ------------
    Dog *dog1 = [[Dog alloc] init];
    Dog *dog2 = [[Dog alloc] init];
    Dog *dog3 = [[Dog alloc] init];
    Dog *dog4 = [[Dog alloc] init];
    
    打印结果
    ------------
    Animal +[Animal load]
    Dog +[Dog load]
    Animal +[Animal initialize]
    Dog +[Dog initialize]
    
    

    相关文章

      网友评论

        本文标题:OC 中 load 方法和 initialize 方法有什么不同

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