Category中+load +initialize调用方法简单总结及区分

+load方法会在runtime加载类,分类的时候调用

每个类,分类的+load 在程序运行过程中只调用一次

调用顺序

  • 1.先调用类的+load
  1. 按照编译先后顺序调用(先编译 先调用)
  2. 调用子类的+load之前先调用父类的+load
  • 2.再调用分类的+load
    1.按照编译先后顺序调用(先编译先调用)

+initialize的原理是通过消息转发机制实现,在类第一次接收到消息时调用.

调用顺序

1.先调用父类的+initialize 再调用子类的initialize

  1. objc_msgSend([TestPerson class],@selector(initialize));
      1. (先初始化父类 再初始化子类 每个类只会初始化1次)

+initialize 是通过objc_msgSend进行调用的有以下特点:

  • 1.如果子类没有实现initialize 会调用父类的initialize(所以父类的+initialize可能会被调用多次)
  • 2.如果分类实现了+initialize 就覆盖类本身的+initialize调用

两者区别

- 1.调用方式

1.)load是根据函数地址直接调用
2.)initialize是通过objc_msgSend调用

- 2. 调用时刻

1.)load是runtime加载类 分类的时候调用(只会调用1次)
2.)initialize是类第一次接收到消息的时候调用,每个类只会initialize一次(父类可能会被多次调用)

- 3.调用顺序

1.)load
1> 先调用类的load
a) 先编译的类,优先调用load
b) 调用子类得到load之前,会先调用父类的load
2> 再调用分类的load
a) 先编译的分类,优先调用load

2.)initialize
1>先初始化父类
2> 再初始化子类(可能最终调用的是父类的initialize方法)

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

相关阅读更多精彩内容

友情链接更多精彩内容