Category中+load +initialize调用方法简单

2022-11-24  本文已影响0人  仰望远处

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

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

调用顺序

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

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

调用顺序

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

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

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

两者区别

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

上一篇下一篇

猜你喜欢

热点阅读