# 51、精简load与initialize的实现代码

`load`：当包含类或分类的程序库载入系统时，就会执行此方法。iOS指应用程序启动时。`load`：执行`load`方法时，运行期系统处于“脆弱状态”方法中使用其他类时不安全的（如：其他类又用到了当前类，则无法正确加载了）。整个应用程序在执行`load`方法时都会阻塞（不要在里面等待锁/加锁）。总之，能不做的事情就别做。

​ `initialize`：在程序首次用该类之前调用，且只调用一次。它时运行期系统来调用的，绝不应该通过代码直接调用。运行期系统在执行该方法时处于正常状态，可以安全使用并调用任意类中的任意方法。运行期系统会确保其在“线程安全的环境”中执行。遵循继承规则。

​ 只应用来设置内部数据，不应调用其他方法，即便时本类自己的方法，也最好别调用。

​ `initialize`需要保持精简的原因：

* 对某个类而言，任何线程都可能初次使用到它，若碰巧时UI线程，那么初始化期间会一直阻塞，导致应用无法响应。
* 开发者无法控制类的初始化时机。不能令代码依赖特定的时间点，否则会很危险
* 若某个了实现很复杂，那么其中可能直接或间接用到其他类。若那些类尚未初始化，则系统会迫使其初始化。其他类的初始化又可能依赖本类的某些数据。代码就无法正常运行了。

还有些详情可看这篇：[iOS\_Extension、Category、load、initialize](https://blog.csdn.net/Margaret_MO/article/details/111143076)

要点：

* 在加载阶段，如果类实现了`load`方法，那么系统就会调用它。分类也可以定义此方法，类的`load`方法要比分类中的先调用。与其他方法不同，`load`方法不参与覆写机制。
* 首次使用某个类之前，系统会向其发送`initialize`消息。由于此方法遵从普通的覆写规则，所以通常应该在里面判断当前要初始化的是哪个类
* `load`与`initialize`方法都应该实现的精简一些，这有助于保持应用程序的响应能力，也能减少引入“依赖环”的几率
* 无法在编译器设定的全局常亮，可以放在`initialize`方法里初始化
