iOS 比较load和initialize方法

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

 

+ (void)load{}

 

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

   也就是说load方法的调用是在main函数之前的.我们可以利用这点,将一些类或者配置文件的注册写在load方法中.在main函数之前会做三件事情:

   1.动态库链接;

   2.ImageLoader加载可执行文件(即二进制文件);

   3.runtime与+load;

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

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

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

   

 

+ (void)initialize{}

 

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

   load和initialize区别:

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

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

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

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

 

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值