+load、+initialize、-init调用时机

+load、+initialize、-init调用时机

Person

#pragma mark - Person
@interface Person : NSObject

@end

@implementation Person

+ (void)load {
    printf("%s\n", __func__);
}

+ (void)initialize {
    printf("%s\n", __func__);
}

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

Person Category

#pragma mark - Person (Male)
@interface Person (Category)

@end

@implementation Person (Category)

+ (void)load {
    printf("%s\n", __func__);
}

@end

Father

#pragma mark - Father
@interface Father : Person

@end

@implementation Father

+ (void)load {
    printf("%s\n", __func__);
}

+ (void)initialize {
    printf("%s\n", __func__);
}

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

@end

Step 1

int main(int argc, const char * argv[]) {
    @autoreleasepool {

    }
    return 0;
}

运行程序,我们看一下输出日志:
+[Person load]
+[Father load]
+[Person(Category) load]

Step 2

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        [Person description];
    }
    return 0;
}

运行程序,我们看一下输出日志:
+[Person load]
+[Father load]
+[Person(Category) load]
+[Person initialize]

Step 3

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        [Person new];
    }
    return 0;
}

运行程序,我们看一下输出日志:
+[Person load]
+[Father load]
+[Person(Category) load]
+[Person initialize]
-[Person init]

Step 4

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        [Father new];
    }
    return 0;
}

运行程序,我们看一下输出日志:
+[Person load]
+[Father load]
+[Person(Category) load]
+[Person initialize]
+[Father initialize]
-[Person init]
-[Father init]

>根据上面的现象可知:
+load:程序运行时自动调用
+initialize:第一次用到这个类时调用,只会调用一次
-init:对象的初始化方法,创建对象时调用

程序启动,目中所有类的+load方法调用,创建对象父类先调用+initialize,然后是子类的+initialize,然后是父类的-init,最后是自己的-init

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,792评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,965评论 18 399
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 2,122评论 0 9
  • Objective C类方法load和initialize的区别过去两个星期里,为了完成一个工作,接触到了NSOb...
    亦晴工作室阅读 1,456评论 0 10
  • 雷纯锋的技术博客Objective-C +load vs +initialize +load和 +initiali...
    林大鹏阅读 570评论 0 1

友情链接更多精彩内容