load and initialize
NSObject是一切OC类的基类,所以我们必须对NSObject所有的方法有一个清楚的认识。
+ (void)load;
当类或者分类被加入到runtime时,load方法会被调用,也就是说在main循环开始前load方法就已经被调用。
(当类被加载到进程的address space时,runtime就会给每个类发送load消息。For classes that are in a shared (dynamically-loaded) library, the runtime sends the load message just after the shared library is loaded into the process's address space.)
由于我们不能确定类加载到runtime中的时间,所以我们要避免在load方法中调用其他oc类。
注意:
- 类的load方法,是在父类的load方法之后调用的
- 分类的load方法,是在类的load方法之后调用的
- 测试发现,只要类被加载到complie source中,即使没使用它,该类一样会被加载到runtime中
- 在load中创建的对象在main循环之前,它们并没被假如到AutoreleasePool中,需要自己手动来处理
+ (void)initialize;
当类,或者任何继承资它的类,在发送第一个消息之前,runtime会发送initialize消息给该类
- 父类先收到initialize消息,子类再收到
- 如果子类没有实现initialize方法,父类可能收到initialize消息(),可以使用下面的方法来阻止收到多次消息
+ (void)initialize {
if (self == [ClassName self]) {
// ... do the initialization ...
}
}
- 每个类的initialize只会调用一次
- initialize是线程安全的,所以尽量在initialize方法中做较少的事
源代码分析:
运行时在调用_class_lookupMethodAndLoadCache时,会先调用void _class_initialize(Class cls),查找oc的源代码(http://opensource.apple.com/source/objc4/objc4-646/runtime/objc-initialize.mm),实际上会先递归调用父类的_class_initialize方法,调用成功后,在调用((void(*)(Class, SEL))objc_msgSend)(cls, SEL_initialize),即调用自己的initialize方法。
总结来说:如果A:B:C:NSObject,当对A第一次调用方法时,会先调用B的initialize方法,在调用A的initialize方法。
load and initialize的更多相关文章
- load和initialize方法
一.load 方法什么时候调用: 在main方法还没执行的时候 就会 加载所有类,调用所有类的load方法. load方法是线程安全的,它使用了锁,我们应该避免线程阻塞在load方法. 在项目中使 ...
- OC load与initialize
OC load与initialize load 当类被引用进程序的时候会执行这个函数 一个类的load方法不用写明[super load],父类就会收到调用,并且在子类之前. Category的loa ...
- load与initialize
NSObject类有两种初始化方式load和initialize load + (void)load; 对于加入运行期系统的类及分类,必定会调用此方法,且仅调用一次. iOS会在应用程序启动的时候调用 ...
- Objective C类方法load和initialize的区别
Objective C类方法load和initialize的区别 过去两个星期里,为了完成一个工作,接触到了NSObject中非常特别的两个类方法(Class Method).它们的特别之处,在于 ...
- NSObject的load和initialize方法(转)
全文转载自:http://www.cocoachina.com/ios/20150104/10826.html 在Objective-C中,NSObject是根类,而NSObject.h的头文件中前两 ...
- load 与initialize的调用顺序小结
开发中实用方法固然是最贴近应用的,当一些程序原理还是要先搞清晰,根据查找的一些资料,总结了一些load与initialize的调用. APP启动到执行main函数之前,程序就执行了很多代码 执行顺 ...
- 细说OC中的load和initialize方法
OC中有两个特殊的类方法,分别是load和initialize.本文总结一下这两个方法的区别于联系.使用场景和注意事项.Demo可以在我的Github上找到--load和initialize,如果觉得 ...
- load vs. initialize
这篇文章来对比一下NSObject类的两个方法,+load与+initialize. + (void)load; Invoked whenever a class or category is add ...
- iOS load和initialize的区别
可能有些还不清楚load和initialize的区别,下面简单说一下: 首先说一下 + initialize 方法:苹果官方对这个方法有这样的一段描述:这个方法会在 第一次初始化这个类之前 被调用,我 ...
- +(void)load; +(void)initialize;有什么用处?
总得来说: 1.+load方法是在main函数之前调用的: 2.遵从先父类后子类,先本类后列类别的顺序调用: 3.类,父类与分类之间的调用是互不影响的.子类中不需要调用super方法,也不会调用父类的 ...
随机推荐
- Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现) .
今天学习了Spinner组件,使用Spinner相当于从下拉列表中选择项目,下面演示一下Spinner的使用(分别使用ArrayAdapter和自定义Adapter实现) (一):使用ArrayAda ...
- AC日记——斗地主(dfs)
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- C# Reflection BindingFlags
定义包含在搜索中的成员 下列 BindingFlags 筛选标志可用于定义包含在搜索中的成员: 为了获取返回值,必须指定 BindingFlags.Instance 或 BindingFlags.St ...
- [本人开发的游戏] Discuz网页动物园插件1.0Beta发布!让积分流动起来!
插件发布 插件名称: DZ网页动物园插件 插件来源: 原创插件 适用版本: Discuz! X3 语言编码: GBK简体 UTF8简体 BIG5繁体 UTF8繁体 最后更新时间: 2014- ...
- QTP基础学习(二)启动与设置
1.启动QTP选择要求的Add-in 默认带有3个Add-in,之后可以安装其他的Add-in,如.net的Add-in 2.设置QTP的选项 点击Tools-Options,弹出如下框: 3.建立记 ...
- TestLink学习五:TestLink1.9.13和JIRA6.3.6的集成
testlink和jira的集成,一般步骤: 第1步:System-Issue Tracker Management添加JIRA的db模式.第2步:测试项目管理,“Issue Tracker Inte ...
- 【Java基础】java 获得本日,本周,本月的时间戳区间
如果涉及到统计的话,可能会经常用到.很简单的基础知识. 1.getTimestampByOffsetDay public static long getTimestampByOffsetDay(int ...
- 关于audio元素在实际项目中遇到的问题总结
在ios高版本的微信浏览器下(ios10.0以上),audio标签如果添加autoplay属性的话.导致的问题是:通过二维码扫码第一次进入没有问题,第二次扫码进入之后直接卡死在loading页面. 解 ...
- 层叠上下文(The stacking context)
MDNThe stacking context 层叠上下文是HTML元素的三维概念,这些HTML元素在一条假想的相对于面向(电脑屏幕的)视窗或者网页的用户的z轴上延伸,HTML元素依据其自身属性按照优 ...
- IEnumerable和IEnumerator 详解 (转)
原文链接:http://blog.csdn.net/byondocean/article/details/6871881 参考链接:http://www.cnblogs.com/hsapphire/a ...