美文网首页iOS Developer
+initialize & +load方法

+initialize & +load方法

作者: Sunxxxxx丶 | 来源:发表于2018-07-09 17:29 被阅读17次
    image.png

    上图为将所有在+load方法里的代码转移到+initialize方法里后的对比图.

    前言

    大家都知道+load方法是在main函数之前被执行的.
    大量重写+load方法会增加APP启动时间.

    所以很多建议都是将在+load方法里执行的事件转移到+initialize
    方法里.

    这里就讲一下这两个方法的差异

    一.异

    +load方法在程序刚启动时就必定会被执行
    +initialize是在第一次向该类发送消息的时候被执行

    +load方法不会被分类覆写
    +initialize方法会被分类覆写 (即本类的+initialize方法永远不会被调用了)

    被子类覆写时.父类的+load和+initialize都是会被调用的.因为子类可能会调用super
    不同点在于:
    不管子类有没有调用super.父类的+load方法都会被调用.
    如果子类的+initialize方法没有调用super.那么父类的+initialize就不会被调用.

    二.同

    +load和+initialize都可能会被调用多次
    见场景一/二.

    三.总结

    重写+load方法时千万不要调用super. (见场景一)
    危害一: 可能会导致父类的+load方法被重复执行
    危害二: 会导致+initialize方法被调用

    重写+initialize方法时也最好不要调用super.(见场景二)

    场景一: +load

    危害一:

    如果父类实现了+load方法.
    那么子类调用[super load];时.父类的load方法又会被执行一遍.

    image.png

    危害二:

    如果子类的+load方法调用了super.
    同时父类又实现了+initialize方法.
    那么会提前触发父类的initialize方法被调用.

    image.png

    场景二:+ initialize被多次调用

    initialize会被多次调用见如图.
    他会在每个子类第一次创建的时候递归再次调用父类的+initialize方法.

    image.png

    场景三: +initialize的触发条件

    +initialize方法只会在第一次向这个类发送消息的时候才会被调用.
    所以这个方法可能永远都不会被调用.

    但并不是只有alloc这样的消息才会触发.类似以下的消息也会触发

    1.[XXClass class]这样的消息也会触发initialize方法
    2.在load方法里NSLog(@“%@“,self);也会触发initialize方法.
    3.在子类的load方法里调用[super load]也会触发initialize方法 (所以千万不要在load方法里调用super.可能会产生莫名其妙的问题)

    相关文章

      网友评论

        本文标题:+initialize & +load方法

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