博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
你需要了解的load和initialize
阅读量:6495 次
发布时间:2019-06-24

本文共 1407 字,大约阅读时间需要 4 分钟。

NSObject类有两种初始化方式loadinitialize

load

+ (void)load;复制代码
  1. 对于加入运行期系统的类及分类,必定会调用此方法,且仅调用一次。

  2. iOS会在应用程序启动的时候调用load方法,在main函数之前调用

  3. 执行子类的load方法前,会先执行所有超类的load方法,顺序为父类->子类->分类

  4. 在load方法中使用其他类是不安全的,因为会调用其他类的load方法,而如果关系复杂的话,就无法判断出各个类的载入顺序,类只有初始化完成后,类实例才能进行正常使用

  5. load 方法不遵从继承规则,如果类本身没有实现load方法,那么系统就不会调用,不管父类有没有实现(跟下文的initialize有明显区别)

  6. 尽可能的精简load方法,因为整个应用程序在执行load方法时会阻塞,即,程序会阻塞直到所有类的load方法执行完毕,才会继续

  7. load 方法中最常用的就是方法交换method swizzling

initialize

+ (void)initialize;复制代码
  1. 在首次使用该类之前由运行期系统(非人为)调用,且仅调用一次

  2. 惰性调用,只有当程序使用相关类时,才会调用

  3. 运行期系统会确保initialize方法是在线程安全的环境中执行,即,只有执行initialize的那个线程可以操作类或类实例。其他线程都要先阻塞,等待initialize执行完

  4. 如果类未实现initialize方法,而其超类实现了,那么会运行超类的实现代码,而且会运行两次(load 第5点)

    • initialize 遵循继承规则

    • 初始化子类的的时候会先初始化父类,然后会调用父类的initialize方法,而子类没有覆写initialize方法,因此会再次调用父类的实现方法

    • 鉴于此,initialize方法实现如下:

      + (void)initialize {      if (self == [People class]) {          NSLog(@"%@ initialize", self);      }  }复制代码
  5. initialize方法也需要尽量精简,一般只应该用来设置内部数据,比如,某个全局状态无法在编译期初始化,可以放在initialize里面。

    static NSMutableArray *kSomeObjects; @implementation People + (void)initialize {     if (self == [People class]) {         kSomeObjects = [NSMutableArray new];      } }复制代码
  6. 对于分类中的initialize方法,会覆盖该类的initialize方法。

总结:

1. 在加载阶段,如果类实现了load方法,系统就会调用它,load方法不参与覆写机制

2. 在首次使用某个类之前,系统会向其发送initialize消息,通常应该在里面判断当前要初始化的类,防止子类未覆写initialize的情况下调用两次

3. load与initialize方法都应该实现得精简一些,有助于保持应用程序的响应能力,也能减少引入“依赖环”(interdependency cycle)的几率

4. 无法在编译期设定的全局常量,可以放在initialize方法里初始化

转载地址:http://vtuyo.baihongyu.com/

你可能感兴趣的文章
浅谈java
查看>>
数据库相关概念
查看>>
gogs结合git-webhook自动部署
查看>>
Table中td的长字符串换行处理
查看>>
Objective-C中的isa、class、SEL、IMP
查看>>
head命令
查看>>
对高可用性的exchange2010的 Array配置
查看>>
操作系统中常用的进程调度算法
查看>>
puppet 使用
查看>>
一次网站负载排查记录
查看>>
Mina使用IoHandler实现业务处理
查看>>
The Competition
查看>>
LVM
查看>>
varnish 性能调优
查看>>
高可用网站的软件质量保证
查看>>
Libpcap tutorial-02
查看>>
java servlet简介-01
查看>>
中文乱码问题的处理
查看>>
Windows10 远程桌面连接失败,报CredSSP加密oracle修正错误解决办法
查看>>
egit在pull的时候出错
查看>>