load和initialize方法区别底层原理

  • load方法的调用时机?
    。在类或者分类开始加进去内存的时候就会调用,其中分类的方法并不会覆盖类中的方法,而且load方法只会程序运行的时候只会调用一次。
    例子:


    image.png

    image.png

    其中DGStudent继承DGPerson,DGPerson+test为person的分类

  • load方法的调用顺序?
    。如果类的方法和分类的方法都有load方法,那么先调用类的方法,如果这个类本身有继承关系,那么先调用父类的方法,在调用子类的方法。
    。分类的load方法调用顺序是按照编译进程序的顺序先后执行的,先编译进去的先调用,后编译进去的后调用,如图:


    image.png

    所以student比DGPerson+test先打印,但是不管怎样最先打印的都是person

  • initalize方法的什么时候调用“
    。当这个类第一次开始接受到消息的时候就开始调用,比如 DGPerson *person = [DGPerson alloc] init]相当于 objc_megSend("person",@selector(@"alloc")),所以就是调用initalize 方法。

  • initalize方法的调用顺序
    。如果有继承的关系,先调用父类的initalize方法,然后在调用子类的initalize方法,如果有分类的initalize方法 先调用分类的initalize方法,分类的initalize的方法调用顺序是越参与编译的越后的越先调用,如:


    image.png

    一个类的initalize方法有可能调用两次,原因是这个类有子类,子类中有实现initalize方法,父类中也实现了initalize方法,那么调用子类的initalize方法 会实现父类的initalize方法和子类的initalize方法(前提是子类没有分类)。如果子类有分类那么实现子类的分类的initalize方法和父类的initalize方法.假如父类也有initalize方法那么调用子类会实现父类的initalize方法和子类的分类的initalize方法

  • initalize 和load方法的区别?
    。initalize是通过消息发送机制开始调用的,而load是类、分类等等开始加进内存中就开始调用。
    。load方法在程序运行期间只调用一次,而initalize是类开始收到消息的时候调用一次,因为存在继承的关系 可能会被调用多次。
    。load方法的优先原则是先调用父类、而initalize是优先调用分类。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容