Objective-C中有两个方法比较特殊,他们会在Runtime时根据情况自动调用,下面我们简单分析一下调用时机以及使用场景~

一般在iOS初中级面试时偶尔会被问到load和initialize方法,我出了一道题,估计会搞晕很多人。大家来看一下下面的程序以及图一会输出什么?(这个Demo请点击这里查看详情)//Father.m

+ (void)load {

NSLog(@"Father:%s %@", __FUNCTION__, [self class]);

}

+ (void)initialize {

NSLog(@"Father:%s %@", __FUNCTION__, [self class]);

}

//Son.m   Class Son Extends Father

+ (void)load {

NSLog(@"Son:%s %@", __FUNCTION__, [self class]);

}

//Son+load.m

+ (void)load {

NSLog(@"Son+load:%s %@", __FUNCTION__, [self class]);

}

//Other.m

+ (void)load {

NSLog(@"Other:%s %@", __FUNCTION__, [self class]);

}

+ (void)initialize {

NSLog(@"Other:%s %@", __FUNCTION__, [self class]);

}

//Other+initialize.m

+ (void)initialize {

NSLog(@"Other+initialize:%s %@", __FUNCTION__, [self class]);

}

//main.m

int main(int argc, char * argv[]) {

NSLog(@"Main method start!");

return 0;

}

我是图一

答案是:

首先来说一下调用时机:+load()方法:官方文档上说Invoked whenever a class or category is added to the Objective-C runtime;,意思是说当类被加载到runtime的时候就会运行,也就是说是在main.m之前~会根据Compile Sources中的顺序来加载,但还有一个需注意的加载顺序

A class’s +load method is called after all of its superclasses’ +load methods.

A category +load method is called after the class’s own +load method.

意思是说有继承关系的会先调用父类+load,扩展的类在所有的类在方法之后再开始扩展方法的+load,每个类只会调用一次+load+initialize()方法:官方文档上说Initializes the class before it receives its first message.意思是在类接收第一条消息之前初始化类

值得注意的点是:类初始化的时候每个类只会调用一次+initialize(),如果子类没有实现+initialize(),那么将会调用父类的+initialize(),也就是意味着父类的+initialize()可能会被多次调用

最后说下使用场景:+load():通常用来进行Method Swizzle,尽量避免过于复杂以及不必要的代码

+initialize():一般用于初始化全局变量或静态变量

EOF:

好了,通过上述的所概括应该能知道为什么答案是那样了~另外如果文章中有什么错误或者意见请大家多多指教~

在c语言中load,一道题理清Objective-C中的load和initialize相关推荐

  1. c语言的字符串不是存放,在C语言中,字符串不存放在一个变量中,而是存放在一个中...

    在C语言中,字符串不存放在一个变量中,而是存放在一个中 答:数组 中国大学MOOC: 请选择恰当的选项填入划线的空白处.国 生活習慣が違います. 答:によって 中国大学MOOC: 下列项目中,不应作为 ...

  2. C语言中static的作用及C语言中使用静态函数有何好处

    转自:http://www.jb51.net/article/74830.htm 在C语言中,static的作用有三条:一是隐藏功能,二是保持持久性功能,三是默认初始化为0. 在C语言中,static ...

  3. c语言中sprintf函数_在C / C ++中使用sprintf()函数

    c语言中sprintf函数 In this article, we'll take a look at using the sprintf() function in C / C++. 在本文中,我们 ...

  4. c语言中isdigit函数_在C / C ++中使用isdigit()

    c语言中isdigit函数 In this article, we'll take a look at using the isdigit() function in C/C++. This is a ...

  5. c语言中int 3.6 =,(C语言中的常量)乐创DIY C语言讲义​——3.6节

    3.6 常量 常量,顾名思义就是在程序执行期间不会改变的固定值.在C语言中,常量的主要作用有两个,其一为给变量赋值,其二为与变量比较,作为判断条件. 在C语言程序中的常量有四大类,分别是整数型常量,浮 ...

  6. c语言中offset用法,offset的使用 汇编中OFFSET的用法和所指内容

    offset在C语言中使用是什么意思啊?? 请教 Excel VBA Range.offset 的用法 Range.Offset 属性 返回 Range 对象,它代表位于指定单元格区域的一定的偏移量位 ...

  7. c语言中code table,unsigned char code table[]中的code的作用

    unsigned char code table[]中的code的作用是告诉单片机,我定义的无符号的字符串组放在ROM(程序存储区)里面,因为C语言中没办法详细描述存入的是ROM还是RAM(寄存器), ...

  8. java语言中if语句的基本语法_java中if语句有哪些形式和用法

    形式一:if语句 if语句是指如果满足某种条件,就进行某种处理.例如,小明妈妈跟小明说"如果你考试得了100分,星期日就带你去游乐场玩".这句话可以通过下面的一段伪代码来描述. 如 ...

  9. C语言中float double等类型在内存中的存储

    问题:十进制数4.5的单精度表示和双精度表示: 备注:   最高位符号位   0表示整数  1表示负数 阶码:  表示的是2的多少次幂这个幂指数 尾数:将其表示成科学计数法之后的舍去科学计数法表示的最 ...

最新文章

  1. 计算机基础及应用教案,计算机应用基础教案:数制的概念及转换(中职教育)
  2. R语言之字符处理(一)
  3. (转)JS window对象的top、parent、opener含义
  4. alloc、init你弄懂50%了吗?
  5. 华为fussioncompute上添加nexentastor作为IPSAN
  6. 翻译:如何用Cocos2d来开发简单的IPhone游戏教程
  7. 总体经济拉动新引擎-农业大健康·张咏:疫情后谋定乡村振兴
  8. vaadin_在Vaadin和JSF之间选择
  9. phpexcel 日期 时分秒_thinkPHP+PHPExcel实现读取文件日期的方法含时分秒
  10. 更新node_kubernetes证书更新
  11. 在github上搭建hexo博客
  12. ActiveMq笔记3-AMQ高可用性理论
  13. pandas--带有重复值的轴索引
  14. 加载脚本依赖发生错误--暴力猴
  15. ecshop网店系统简评
  16. 成为一名数据分析师,需要学习统计学吗?
  17. DSN文件怎么用Proteus打开
  18. 专访有赞 CTO 崔玉松:打造中国 SaaS 领域最好的开店软件解决方案
  19. 吴式太极拳的特点-和基础要求
  20. java闪光灯手电筒_Android_Android 开启闪光灯做手电筒的详解,复制代码 代码如下:public class H - phpStudy...

热门文章

  1. js中调用C标签实现百度地图
  2. 分步表单_角色创建分步指南
  3. 入坑 Electron 开发跨平台桌面应用
  4. 安装jenkins时出现 No such plugin: cloudbees-folder的解决办法
  5. MpAndroidChart源码修改之饼状图添加标志线
  6. SQL Server CONVERT() 日期转换为新数据类型的 通用函数
  7. 关于是否在C#中加入不可空引用类型的争论
  8. lucene两个分页操作
  9. mysql 怎么实现随机查询并分页,不重复查询
  10. WordCount--统计输入文件的字符数、行数、单词数(java)--初级功能