iOS 比较load和initialize方法

来源:互联网 发布:淘宝排除同款 编辑:程序博客网 时间:2024/06/11 00:31

iOS中,类需要执行初始化操作才能正常使用。继承于NSObject的类有两种实现初始化类的方法:load initialize方法。


+ (void)load{}


   对于加入运行期的类或分类来说,如果该类实现了load方法,必定会调用此方法,且只调用一次。当包含类或分类的程序载入系统时,会执行该方法,一般都是程序启动的时候。如果分类和类中都定义了load方法,先调用类中的load,再调用分类中的。

   load方法的问题在于:执行该方法时,运行期系统处于脆弱状态。在执行子类的load方法之前,必定会执行所有超类的load方法,如果程序还依赖了其他程序库,程序库中相关的类的load方法也会执行,而且是先执行。问题在于:根据给定的程序库,无法判断各个类的载入顺序,比如在某各类中引入了一个其他类,在该类的load方法要创建其他类的一个实例,但是无法确定在执行该类的load方法之前,其他类是不是已经加载好了。也许在其他类中的load方法中执行了某些重要操作,执行执行完之后,该实例才能使用。

     load方法不遵守继承规则,如果某个类中本身没有实现load方法,即使各级超类中实现load方法,系统都不会调用。

   还有一个问题:load方法务必精简一些,尽量减少执行的操作。因为整个应用在执行load方法时都会阻塞。凡是想通过load在类加载之前做一些操作的都不对。load方法的真正用途在于调试程序。判断类或分类是否正确载入到系统。

   


+ (void)initialize{}


   如果想执行与类相关的初始化操作,可以覆写initialize方法。该方法也是在程序首次用该类的时候调用且调用一次。它是由运行期系统调用的,绝不可以通过代码直接调用。

   loadinitialize区别:

    1.initialize方法是惰性调用的,只有程序使用的时候才调用,如果一个类一直没有使用过,也就不会调用initialize方法。也就是说应用程序无需把每个类中的initialize都执行一遍。

    2.运行期执行initialize方法时,是处于正常状态的。在initialize方法可以安全使用并调用任意类的任意方法。

    3.initialize方法遵循继承原则,如果某个类没有实现它,但其超类实现了,那么就会执行超类的initialize方法。加入一个类没有实现initialize方法,其有一个父类实现了该方法,那么在调用子类时,会同时调用两次父类initialize方法的。因为子类没有覆盖父类的initialize的实现,因此还要把父类的实现在执行一遍。所以通常在initialize中判断当前要初始化的是哪个类。

    4.如果全局状态无法在编译器初始化,可以放在initialize中实现。例如可变数组,不能再编译器初始化,因为创建实例之前必须先激活运行期系统。这种就可以在initialize方法中初始化。


   但是initialize方法和load方法都尽量要精简。因为如果代码很复杂,其中可能会直接或间接的引用到其他类,若那些类尚未初始化,则系统会迫使其初始化。然而,本类的初始化此时尚未运行完毕。其他类在运行initialize方法时,有可能会依赖本类中的数据,引入依赖环


0 0
原创粉丝点击