美文网首页
iOS load 和 initialize 方法的调用

iOS load 和 initialize 方法的调用

作者: 看个客人 | 来源:发表于2018-12-14 17:26 被阅读12次

    +(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
    

    相关文章

      网友评论

          本文标题:iOS load 和 initialize 方法的调用

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