你需要了解的load和initialize
NSObject类有两种初始化方式
load
和initialize
load
+ (void)load;
复制代码
对于加入运行期系统的类及分类,必定会调用此方法,且仅调用一次。
iOS会在应用程序启动的时候调用
load
方法,在main
函数之前调用执行子类的load方法前,会先执行所有超类的load方法,顺序为父类->子类->分类
在load方法中使用其他类是不安全的,因为会调用其他类的load方法,而如果关系复杂的话,就无法判断出各个类的载入顺序,类只有初始化完成后,类实例才能进行正常使用
load 方法不遵从继承规则,如果类本身没有实现load方法,那么系统就不会调用,不管父类有没有实现(跟下文的initialize有明显区别)
尽可能的精简
load
方法,因为整个应用程序在执行load方法时会阻塞,即,程序会阻塞直到所有类的load方法执行完毕,才会继续load 方法中最常用的就是方法交换
method swizzling
initialize
+ (void)initialize;
复制代码
在首次使用该类之前由运行期系统(非人为)调用,且仅调用一次
惰性调用,只有当程序使用相关类时,才会调用
运行期系统会确保
initialize
方法是在线程安全的环境中执行,即,只有执行initialize的那个线程可以操作类或类实例。其他线程都要先阻塞,等待initialize执行完如果类未实现
initialize
方法,而其超类实现了,那么会运行超类的实现代码,而且会运行两次(load 第5点)initialize 遵循继承规则
初始化子类的的时候会先初始化父类,然后会调用父类的
initialize
方法,而子类没有覆写initialize
方法,因此会再次调用父类的实现方法鉴于此,
initialize
方法实现如下:+ (void)initialize {if (self == [People class]) {NSLog(@"%@ initialize", self);}} 复制代码
initialize方法也需要尽量精简,一般只应该用来设置内部数据,比如,某个全局状态无法在编译期初始化,可以放在initialize里面。
static NSMutableArray *kSomeObjects;@implementation People+ (void)initialize {if (self == [People class]) {kSomeObjects = [NSMutableArray new]; }} 复制代码
对于分类中的
initialize
方法,会覆盖该类的initialize
方法。
总结:
1. 在加载阶段,如果类实现了load方法,系统就会调用它,load方法不参与覆写机制
2. 在首次使用某个类之前,系统会向其发送initialize消息,通常应该在里面判断当前要初始化的类,防止子类未覆写initialize
的情况下调用两次
3. load与initialize方法都应该实现得精简一些,有助于保持应用程序的响应能力,也能减少引入“依赖环”(interdependency cycle)的几率
4. 无法在编译期设定的全局常量,可以放在initialize方法里初始化
你需要了解的load和initialize相关推荐
- Load和Initialize往死了问是一种怎样的体验?
2017.08.08 这个问题有点炒冷饭了,写了 demo 才更深入的了解这个问题,就当做个简单的笔记吧 一. Load和Initialize的往死了问是一种怎样的体验? Load 和 Initial ...
- iOS---Objective-C: +load vs +initialize
在 NSObject 类中有两个非常特殊的类方法 +load 和 +initialize ,用于类的初始化.这两个看似非常简单的类方法在许多方面会让人感到困惑,比如: 子类.父类.分类中的相应方法什么 ...
- Load和Initialize的往死了问是一种怎样的体验
Load 和 Initialize 先加载哪个? 父类和子类以及 Category 的关系? 如果是多个 Category 呢? Load 开发文档的直接解读 加载顺序总结 所有类和分类的 +load ...
- oc---类方法load和initialize的区别
在iOS开发中,就像Application有生命周期回调方法一样,在Objective-C的类被加载和初始化的时候,也可以收到方法回调,可以在适当的情况下做一些定制处理.而这正是本篇文章所要介绍的lo ...
- 在c语言中load,一道题理清Objective-C中的load和initialize
Objective-C中有两个方法比较特殊,他们会在Runtime时根据情况自动调用,下面我们简单分析一下调用时机以及使用场景~ 一般在iOS初中级面试时偶尔会被问到load和initialize方法 ...
- 解读OC中的load和initialize
在 Objective-C 中,NSObject 是绝大多数类的基类.而在 NSObject 中有两个类方法 load 和 initialize,那这两个方法是在什么时机被调用呢?父类.Categor ...
- iOS—分类、load 、initialize
文章目录 分类 分类的结构 load方法的调用顺序 initialize load和initialize区别 分类在运行期做了什么 为什么category不能添加成员变量 分类能否添加属性 使用关联对 ...
- iOS之深入解析类方法+load与+initialize的底层原理
一.前言 Objective-C 作为一门面向对象语言,有类和对象的概念.编译后,类相关的数据结构会保留在目标文件中,在运行时得到解析和使用.在应用程序运行起来的时候,类的信息会有加载和初始化过程. ...
- iOS 中 load 和 initialize的实现顺序
1 load 函数 调用时机,当类引用进项目的时候执行load函数,在main函数开始之前,与 这个类是否被用到是无关的,每个类的load函数都会自动调用一次. 1 父类和子类都实现load函数的时候 ...
最新文章
- WR:Tetrasphaera PAO 代谢中的储能物质与微生物多样性及除磷效能之间的关系
- Python---获取div标签中的文字
- [bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函数+多项式运算+FFT)
- 截止角频率和截止频率的关系_开关电源的控制环截止频率和开关频率有什么关系?...
- BLOB,TEXT GEOMETRY or JSON column 'xxx' can't have a default value query问题解决
- PHP实现简单的计算器
- 用python语言写一个简单的计算器
- Eclipse中移除native层编译支持
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(五)讲一下maven
- python 读grid 数据_jqGrid获取到python返回的Json数据,未能显示到页面上,为毛???...
- 冒险岛如何修改服务器wz,冒险岛怎么WZ修改攻击力说好了加100分
- 微信公众号基础篇(个人订阅号)
- 数据库中的主键与外键的关系
- Python学习笔记—— 面向对象4.类属性、类方法、静态方法
- 模拟美式橄榄球比赛数据(R)
- 【简单快捷教会你】如何正确使用animate.css,各种动态效果。
- 叶俊:能量获取的秘籍-奇文
- 最详细的VI编辑器指南
- 2020,不会分布式怎么可以,这2份pdf共1000+,从原理到系统实现都包含了
- ibm服务器修复安装win7系统,联想thinkpad无法开机重装win7,教你重装系统攻略
热门文章
- 回调函数在C/C++中的使用
- 【C++】Effective STL:50条有效使用STL的经验
- Ruby DSL介绍及其在测试数据构造中的使用(2)
- linux进程状态d状态,Linux下进程的状态
- 教学案例 计算机,计算机教学案例及反思
- android锁屏流程_Android开机锁屏流程分析
- Redis初学:14(Redis中的事务)
- wxpython有没有可视化设计_wxPython - GUI Builder工具( GUI Builder Tools)
- Java项目:小蜜蜂扩音器网上商城系统(java+JSP+Servlet+JDBC+Ajax+mysql)
- Java项目:在线拍卖竞价系统(java+SpringBoot+FreeMarker+Mysql+redis)