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方法里初始化

你需要了解的load和initialize相关推荐

  1. Load和Initialize往死了问是一种怎样的体验?

    2017.08.08 这个问题有点炒冷饭了,写了 demo 才更深入的了解这个问题,就当做个简单的笔记吧 一. Load和Initialize的往死了问是一种怎样的体验? Load 和 Initial ...

  2. iOS---Objective-C: +load vs +initialize

    在 NSObject 类中有两个非常特殊的类方法 +load 和 +initialize ,用于类的初始化.这两个看似非常简单的类方法在许多方面会让人感到困惑,比如: 子类.父类.分类中的相应方法什么 ...

  3. Load和Initialize的往死了问是一种怎样的体验

    Load 和 Initialize 先加载哪个? 父类和子类以及 Category 的关系? 如果是多个 Category 呢? Load 开发文档的直接解读 加载顺序总结 所有类和分类的 +load ...

  4. oc---类方法load和initialize的区别

    在iOS开发中,就像Application有生命周期回调方法一样,在Objective-C的类被加载和初始化的时候,也可以收到方法回调,可以在适当的情况下做一些定制处理.而这正是本篇文章所要介绍的lo ...

  5. 在c语言中load,一道题理清Objective-C中的load和initialize

    Objective-C中有两个方法比较特殊,他们会在Runtime时根据情况自动调用,下面我们简单分析一下调用时机以及使用场景~ 一般在iOS初中级面试时偶尔会被问到load和initialize方法 ...

  6. 解读OC中的load和initialize

    在 Objective-C 中,NSObject 是绝大多数类的基类.而在 NSObject 中有两个类方法 load 和 initialize,那这两个方法是在什么时机被调用呢?父类.Categor ...

  7. iOS—分类、load 、initialize

    文章目录 分类 分类的结构 load方法的调用顺序 initialize load和initialize区别 分类在运行期做了什么 为什么category不能添加成员变量 分类能否添加属性 使用关联对 ...

  8. iOS之深入解析类方法+load与+initialize的底层原理

    一.前言 Objective-C 作为一门面向对象语言,有类和对象的概念.编译后,类相关的数据结构会保留在目标文件中,在运行时得到解析和使用.在应用程序运行起来的时候,类的信息会有加载和初始化过程. ...

  9. iOS 中 load 和 initialize的实现顺序

    1 load 函数 调用时机,当类引用进项目的时候执行load函数,在main函数开始之前,与 这个类是否被用到是无关的,每个类的load函数都会自动调用一次. 1 父类和子类都实现load函数的时候 ...

最新文章

  1. WR:Tetrasphaera PAO 代谢中的储能物质与微生物多样性及除磷效能之间的关系
  2. Python---获取div标签中的文字
  3. [bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函数+多项式运算+FFT)
  4. 截止角频率和截止频率的关系_开关电源的控制环截止频率和开关频率有什么关系?...
  5. BLOB,TEXT GEOMETRY or JSON column 'xxx' can't have a default value query问题解决
  6. PHP实现简单的计算器
  7. 用python语言写一个简单的计算器
  8. Eclipse中移除native层编译支持
  9. Spring+SpringMVC+MyBatis+easyUI整合基础篇(五)讲一下maven
  10. python 读grid 数据_jqGrid获取到python返回的Json数据,未能显示到页面上,为毛???...
  11. 冒险岛如何修改服务器wz,冒险岛怎么WZ修改攻击力说好了加100分
  12. 微信公众号基础篇(个人订阅号)
  13. 数据库中的主键与外键的关系
  14. Python学习笔记—— 面向对象4.类属性、类方法、静态方法
  15. 模拟美式橄榄球比赛数据(R)
  16. 【简单快捷教会你】如何正确使用animate.css,各种动态效果。
  17. 叶俊:能量获取的秘籍-奇文
  18. 最详细的VI编辑器指南
  19. 2020,不会分布式怎么可以,这2份pdf共1000+,从原理到系统实现都包含了
  20. ibm服务器修复安装win7系统,联想thinkpad无法开机重装win7,教你重装系统攻略

热门文章

  1. 回调函数在C/C++中的使用
  2. 【C++】Effective STL:50条有效使用STL的经验
  3. Ruby DSL介绍及其在测试数据构造中的使用(2)
  4. linux进程状态d状态,Linux下进程的状态
  5. 教学案例 计算机,计算机教学案例及反思
  6. android锁屏流程_Android开机锁屏流程分析
  7. Redis初学:14(Redis中的事务)
  8. wxpython有没有可视化设计_wxPython - GUI Builder工具( GUI Builder Tools)
  9. Java项目:小蜜蜂扩音器网上商城系统(java+JSP+Servlet+JDBC+Ajax+mysql)
  10. Java项目:在线拍卖竞价系统(java+SpringBoot+FreeMarker+Mysql+redis)