有时候,类必须执行某些初始化操作才能正常使用。OC中的大部分类都继承自NSObject,它提供了两个可以执行初始化操作的方法。
- (void)load;
被加入运行期系统(iOS一般是应用启动时)的类和分类都会调用这个方法,只调用一次。先调用类里的,再调用分类的。按照分类引入的顺序,调用分类的load方法。
在load方法中调用别的类是不安全的!因为不知道它们调用的顺序,比如代码中还依赖别的库,别的库的相关类的load方法也会执行,会出现交叉的情况。
注意:load方法不遵从继承。即:类中没实现load方法,不管超类是否实现load方法,都不会去执行。能精简尽量精简。
- (void)initialize;
首次用类的时候会调用这个类,只调用一次,惰性调用。它是由运行时系统来调用的,不能直接调用。
initialize方法是在线程安全的环境下调用,可以操作类或类的实例
initialize方法遵循继承规则,如果类中没实现它,会去调用超类中的实现。
方法里的代码要精简,设置一些状态,是类能正常进行即可,不要执行一些耗时或者需要加锁的任务。
initialize方法只应该用来设置内部数据。不应该在其中调用别的方法,即使是自己的方法也不该调用。例如:某个全局状态在编译器没办法编译期初始化,就可以放在这里。
比如:单例类在首次调用之前,必须执行某些操作,就可以使用initialize方法。
网友评论