10、load、initialize方法的区别什么?在继承关系中他们有什么区别
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,这里我给大家画个图梳理一下:
initialize:当类或子类第一次收到消息时被调用(即:静态方法或实例方法第一次被调用,也就是这个类第一次被用到的时候),只调用一次
调用方式是通过runtime的objc_msgSend的方式调用的,此时所有的类都已经装载完毕
子类和父类同时实现initialize,父类的先被调用,然后调用子类的
本类与category同时实现initialize,category会覆盖本类的方法,只调用category的
initialize一次(这也说明initialize的调用方式采用objc_msgSend的方式调用的)
initialize是主动调用的,只有当类第一次被用到的时候才会触发
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。