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方法)

你可能感兴趣的:(Category中+load +initialize调用方法简单总结及区分)