51、精简load与initialize的实现代码
load:当包含类或分类的程序库载入系统时,就会执行此方法。iOS指应用程序启动时。load:执行load方法时,运行期系统处于“脆弱状态”方法中使用其他类时不安全的(如:其他类又用到了当前类,则无法正确加载了)。整个应用程序在执行load方法时都会阻塞(不要在里面等待锁/加锁)。总之,能不做的事情就别做。
initialize:在程序首次用该类之前调用,且只调用一次。它时运行期系统来调用的,绝不应该通过代码直接调用。运行期系统在执行该方法时处于正常状态,可以安全使用并调用任意类中的任意方法。运行期系统会确保其在“线程安全的环境”中执行。遵循继承规则。
只应用来设置内部数据,不应调用其他方法,即便时本类自己的方法,也最好别调用。
initialize需要保持精简的原因:
对某个类而言,任何线程都可能初次使用到它,若碰巧时UI线程,那么初始化期间会一直阻塞,导致应用无法响应。
开发者无法控制类的初始化时机。不能令代码依赖特定的时间点,否则会很危险
若某个了实现很复杂,那么其中可能直接或间接用到其他类。若那些类尚未初始化,则系统会迫使其初始化。其他类的初始化又可能依赖本类的某些数据。代码就无法正常运行了。
还有些详情可看这篇:iOS_Extension、Category、load、initialize
要点:
在加载阶段,如果类实现了
load方法,那么系统就会调用它。分类也可以定义此方法,类的load方法要比分类中的先调用。与其他方法不同,load方法不参与覆写机制。首次使用某个类之前,系统会向其发送
initialize消息。由于此方法遵从普通的覆写规则,所以通常应该在里面判断当前要初始化的是哪个类load与initialize方法都应该实现的精简一些,这有助于保持应用程序的响应能力,也能减少引入“依赖环”的几率无法在编译器设定的全局常亮,可以放在
initialize方法里初始化
Last updated
Was this helpful?