开发者社区> 问答> 正文

10、load、initialize方法的区别什么?在继承关系中他们有什么区别

10、load、initialize方法的区别什么?在继承关系中他们有什么区别

展开
收起
游客bnlxddh3fwntw 2020-04-13 15:19:08 1813 0
1 条回答
写回答
取消 提交回答
  • load:当类被装载的时候被调用,只调用一次

    调用方式并不是采用runtime的objc_msgSend方式调用的,而是直接采用函数的内存地址直接调用的 多个类的load调用顺序,是依赖于compile sources中的文件顺序决定的,根据文件从上到下的顺序调用 子类和父类同时实现load的方法时,父类的方法先被调用 本类与category的调用顺序是,优先调用本类的(注意:category是在最后被装载的) 多个category,每个load都会被调用(这也是load的调用方式不是采用objc_msgSend的方式调用的),同样按照compile sources中的顺序调用的 load是被动调用的,在类装载时调用的,不需要手动触发调用 注意:当存在继承关系的两个文件时,不管父类文件是否排在子类或其他文件的前面,都是优先调用父类的,然后调用子类的。

    例如:compile sources中的文件顺序如下:SubB、SubA、A、B,load的调用顺序是:B、SubB、A、SubA。

    分析:SubB是排在compile sources中的第一个,所以应当第一个被调用,但是SubB继承自B,所以按照优先调用父类的原则,B先被调用,然后是SubB,A、SubA。

    第二种情况:compile sources中的文件顺序如下:B、SubA、SubB、A,load调用顺序是:B、A、SubA、SubB,这里我给大家画个图梳理一下:

    image.png

    initialize:当类或子类第一次收到消息时被调用(即:静态方法或实例方法第一次被调用,也就是这个类第一次被用到的时候),只调用一次

    调用方式是通过runtime的objc_msgSend的方式调用的,此时所有的类都已经装载完毕

    子类和父类同时实现initialize,父类的先被调用,然后调用子类的

    本类与category同时实现initialize,category会覆盖本类的方法,只调用category的

    initialize一次(这也说明initialize的调用方式采用objc_msgSend的方式调用的)

    initialize是主动调用的,只有当类第一次被用到的时候才会触发

    2020-04-13 15:19:50
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
建立联系方法之一 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载