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

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

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

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

initialize需要保持精简的原因:

  • 对某个类而言,任何线程都可能初次使用到它,若碰巧时UI线程,那么初始化期间会一直阻塞,导致应用无法响应。

  • 开发者无法控制类的初始化时机。不能令代码依赖特定的时间点,否则会很危险

  • 若某个了实现很复杂,那么其中可能直接或间接用到其他类。若那些类尚未初始化,则系统会迫使其初始化。其他类的初始化又可能依赖本类的某些数据。代码就无法正常运行了。

还有些详情可看这篇:iOS_Extension、Category、load、initialize

要点:

  • 在加载阶段,如果类实现了load方法,那么系统就会调用它。分类也可以定义此方法,类的load方法要比分类中的先调用。与其他方法不同,load方法不参与覆写机制。

  • 首次使用某个类之前,系统会向其发送initialize消息。由于此方法遵从普通的覆写规则,所以通常应该在里面判断当前要初始化的是哪个类

  • loadinitialize方法都应该实现的精简一些,这有助于保持应用程序的响应能力,也能减少引入“依赖环”的几率

  • 无法在编译器设定的全局常亮,可以放在initialize方法里初始化

Last updated

Was this helpful?