目录
1 Runtime 概述
1.1 什么是Runtime
如果用一句话介绍什么是Objective-C,下面这个公式再恰当不过了。
OC = C + Preprocessor + Runtime
三十几年前,Brac Cox为了在C语言基础上扩展OOP,借用了Smalltalk的思想,开发了Objective-C语言(参考《Object-Oriented Programming: An Evolutionary Approach》)进行了介绍。为了便于parse类似Smalltalk的语法,发明了中括号的消息发送[Dog name:name]
,然后通过一个Preprocessor预处理成C语言。虽然语法进行了转换,但是如何在此基础上搭建OOP模型呢,即:
- 实现OOP对象模型(Preprocessor);
- 实现类的消息发送(Runtime)。
对象模型直接照搬Smalltalk的设计思想就可以,即Object/Class/MetaClass等,直接用C的Struct实现即可;以及某些self/super/nil等关键字的实现。上述步骤通过Preprocessor即可实现。但是Instance Method/Class Method这些消息机制,通过向target(instance/class)发送消息名(selector)动态寻找到函数的实现(IMP),以及向父类传递消息和消息转发等,并不能通过Preprocessing或Build Time实现,需要通过运行时的C函数支持,这些函数打包一起,便是Runtime。
1.2 Runtime大局观
Runtime主要有Object Model和Messaging两大主题组成,笔者总结成下表,后面的文章会详细介绍。
1.3 Runtime API
熟悉runtime的API有助于后面文章的学习,笔者将它总结成下图。
1.4 Runtime使用场景
通常我们有3个level来使用Runtime:
-
Objecttive-C Source Code,大部分情况下,runtime在OC代码背后自动执行,开发者只需要写可以编译通过的OC源码即可。
-
NSObject Methods,大部分类在Cocoa里都是
NSObject
的子类,因此,它们都继承了NSObject
的methods(NSProxy
是例外)。这些方法包括description
,isKindOfClass
,isMemberOfClass
,respondsToSelector
,conformsToProtocol
,methodForSelector
等。这些方法给object自省(introspect)的功能。(顺便吐槽下,人如果有自省功能就好了,知道自己可行的行为,父类;或者说人有更高一级自省的功能,就是在不断探索的工程中发现认识自己。) -
Runtime API,runtime头文件在
/usr/include/objc
路径下,包括了各种数据结构和方法。它可以让开发者用c语言重复编译器对OC源码进行的工作。具体请参看《Runtime Programming Guide》。
2 总结
本文对runtime从整体上进行了介绍,包括runtime在OC中的角色,两大主题(Object Model & Messaging)和实现的API,以及Runtime的使用场景。