Objective-C中load和initialize有点难的一道题
来源:互联网 发布:淘宝美式画 编辑:程序博客网 时间:2024/05/16 13:00
原文来自:Objective-C中load和initialize有点难的一道题
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.mint 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():一般用于初始化全局变量或静态变量
- Objective-C中load和initialize有点难的一道题
- Objective-C中类的+load和+initialize
- Objective-C中load和initialize方法的区别和相同点
- Objective C类方法load和initialize的区别
- Objective C类方法load和initialize的区别
- Objective C类方法load和initialize的区别
- Objective C类方法load和initialize的区别
- Objective C类方法load和initialize的区别
- 1.Objective C类方法load和initialize的区别
- Objective C类方法load和initialize的区别
- Objective C类方法load和initialize的区别
- Objective C类方法load和initialize的区别
- Objective C类方法load和initialize的区别
- Objective C类方法load和initialize的区别
- Objective C类方法load和initialize的区别
- Objective C类方法load和initialize的区别
- Objective C类方法load和initialize的区别
- Objective C类方法load和initialize的区别
- Linux C文件操作(一)
- 美化linux终端界面
- C# 常用正则表达式验证
- 深度学习
- C#事件——对委托的封装
- Objective-C中load和initialize有点难的一道题
- 策略模式
- android应用开发-从设计到实现 2-9 界面模式
- Opencv学习笔记一,各种结构说明
- Perl Unicode 全攻略:
- java web项目中实现打印功能(lodop)
- 第18题:4Sum
- 搜索技巧
- C#简单窗体应用程序(三)