iOS load 和 initialize 方法的调用

+(void)load详解

+(void)load调用时机

load方法的加载和这个类是否被使用到无关,这也是为什么可以在ios端能够做到无痕埋点的原因。子类是否重写父类的load方法和这个方法的调用无关,所以也就不需要在子类的方法里面调用父类方法,他的调用在init main方法之前,只会被调用一次且线程安全。

+(void)load 调用顺序

新建三个类GrandPar->Parent->Son和两个类别(GrandPar+addtion,Son+addtion)分别在里面实现了load方法,调用结果如下:

2018-12-14 17:04:23.038176+0800 NSOperation[4094:2759698] =====GrandPar-load
2018-12-14 17:04:23.038361+0800 NSOperation[4094:2759698] =====Parent-load
2018-12-14 17:04:23.038386+0800 NSOperation[4094:2759698] =====Son-load
2018-12-14 17:04:23.038398+0800 NSOperation[4094:2759698] =====GrandPar-addtion-load
2018-12-14 17:04:23.038406+0800 NSOperation[4094:2759698] =====Son-addtion-load

可以看出他是最先调用类再是类别,顺序都是至上到下的关系。

+(void)load 使用场景

一般都是利用类别来做一些黑魔法 - Method Swizzling 操作,页面计时,数组字典常见崩溃处理等,他的侵入总是悄无声息的,不需要任何的引用。

+(void)initialize详解

initialize的调用时机是发生在init main方法以后,他发生调用是在为该类的生成一个对象的时候,不管子类有没有实现initialize的方法,在使用该类时都会依次调用父类的initialize的方法。和load方法不同的是当类别和类都实现的该方法,那么类的initialize方法不会被调用会被类别覆盖。下面是我两次不同的调用结果:

2018-12-14 17:21:33.654978+0800 NSOperation[4111:2766460] ====GrandPar-initialize
2018-12-14 17:21:33.655014+0800 NSOperation[4111:2766460] ====Parent-initialize
2018-12-14 17:21:33.655045+0800 NSOperation[4111:2766460] ====Parent-initialize
//同时实现的Son和类别的initialize方法
2018-12-14 17:19:26.202089+0800 NSOperation[4108:2765701] ====GrandPar-initialize
2018-12-14 17:19:26.202125+0800 NSOperation[4108:2765701] ====Parent-initialize
2018-12-14 17:19:26.202134+0800 NSOperation[4108:2765701] ====son-initialize-addtion
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容