http://www.tekuba.net/program/335/
本系列主要参考资料:
Objective-C Runtime Reference
Objective-C Runtime Programming Guide
涉及主要文件:objc/message.h,objc/objc-api.h,objc/objc.h,objc/runtime.h
特酷吧[tekuba.net]采用"署名-非商业用途-保持一致"的创作共用协议,使用本文内容请遵循该协议
Objective-C Runtime是Objective-C的基础内容,理解了Objective-C Runtime对于掌握Objective-C的很多技术原理非常有用。特酷吧特别整理了Objective-C Runtime的内容,共六篇,本文是第一篇:
《Objective-C Runtime分析(一)-Runtime初步》
《Objective-C Runtime分析(二)-Class,Method,SEL,IMP》
《Objective-C Runtime分析(三)-objc_msgSend》
《Objective-C Runtime分析(四)--Dynamic Method Resolution》
《Objective-C Runtime分析(五)-Message Forwarding》
《Objective-C Runtime分析(六)-Type Encodings & Declared Properties》
一,什么是Objective-C Runtime
简单的说,Objective-C是一门动态语言,它会将编译和链接时要做的事情推迟到运行时进行。这就意味着Objective-C语言不仅需要一个编译环境,还需要一个运行时系统(动态语言一般都会有自己的运行时系统,比如JAVA Runtime)来执行编译好的代码。Objective-C Runtime好比Objective-C的操作系统,Objective-C基于Objective-C Runtime来工作。因此,可以说Objective-C Runtime是Objective-C的基础,灵魂。
二,动态语言 VS 静态语言
特酷吧在最开始接触Objective-C Runtime,看到上方的解释时还是一头雾水,到底什么样的语言才算是动态语言?别急,看完下面的例子,你就应该清楚了。
用静态语言C语言写出下面的代码:
折叠展开C/C++ Code复制内容到剪贴板
- #include <stdio.h>
- int main(int argc, const char **argv[])
- {
- printf("Hello tekuba!");
- return 0;
- }
把代码编译,会经过编译器语法分析,优化翻译成机器语言,系统按照你设计的逻辑和自上而下的执行你的代码。
而在Objective-C中,都是发送消息,比如:
[tekuba hello];
会被编译器替换成成:
objc_msgSend(tekuba, selector);
如果有参数,则可能是:
objc_msgSend(tekuba , selector, arg1, arg2, …);
消息只有到运行时才会和函数实现绑定起来,而不是像C语言一样按照编译好的逻辑一成不变的执行。也就是说,编译阶段只是确定了要向tekuba对象发送hello消息,但是却没有发送,真正发送是等到运行的时候进行。因此,编译阶段完全不知道hello方法的具体实现,甚至该方法到底有没有被实现也不知道。说到这里,特酷吧想到了之前接触windows编程的时候,有个很重要的概念:“windows的消息机制”,特酷吧的理解是它其实也是一种“runtime”机制。但因为它不像NSObject-C这样具有自我检查等优秀的能力,所以看上去并不是特别突出。
也就是说,所谓的“runtime”实际上就是一个管理运行代码的环境机制,保证了代码在运行中有自我检查,判断的能力。
三,Objective-C runtime是开源的
目前苹果公司和GNU各自维护一个开源的runtime版本。苹果的项目地址是:http://opensource.apple.com/tarballs/objc4/
The Objective-C Runtime is open source and available anytime from http://opensource.apple.com. In fact examining the Objective-C is one of the first ways I went through to figure out how it worked, beyond reading Apples documentation on the matter. You can download the current version of the runtime (as of this writting) for Mac OS X 10.6.2 here objc4-437.1.tar.gz.
Objective-c runtime是由C语言实现的。runtime作为Objective-C最核心的部分几乎全部由C语言实现。这里的“几乎”所指的例外就包含有的方法(比如objc_msgSend方法)甚至是用汇编实现的。
四,和Objective-C runtime交互
参考:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtInteracting.html
Objective-C程序有三种途径和运行时系统交互[Objective-C programs interact with the runtime system at three distinct levels: through Objective-C source code; through methods defined in the NSObject class of the Foundation framework; and through direct calls to runtime functions]。
1、Objective-C Source Code
大部分情况下,运行时系统在后台自动运行,我们只需编写和编译 Objective-C 源代码。
当编译Objective-C类和方法时,编译器为实现语言动态特性将自动创建一些数据结构和函数。这些数据结构包含类定义和协议类定义中的信息,
2、NSObject Methods
Cocoa程序中绝大部分类都是NSObject类的子类,所以大部分都继承了NSObject类的方法,因而继承 了NSObject的行为(NSProxy类是个例外)。然而,某些情况下, NSObject类仅仅定义了完成某件事情的模板,而没有提供所有需要的代码。
例如,NSObject 类定义了description方法,返回该类内容的字符串表示。这主要是用来调试程序:GDB 中的 print-object 方法就是直接打印出该方法返回的字符串。NSObject 类中该方法的 实现并不知道子类中的内容,所以它只是返回类的名字和对象的地址。NSObject 的子类可以重新实现该方法以提供更多的信息。例如,NSArray 类改写了该方法来返回 NSArray 类包含的每个对象的内容。
某些 NSObject 的方法只是简单地从运行时系统中获得信息,从而允许对象进行一定程度的自我检查。例如,class 返回对象的类;isKindOfClass:和 isMemberOfClass:则检查对象是否在指定的 类继承体系中;respondsToSelector:检查对象能否响应指定的消息;conformsToProtocol: 检查对象是否实现了指定协议类的方法;methodForSelector:则返回指定方法实现的地址。
3、Runtime Functions
运行时系统是一个有公开接口的动态库,由一些数据结构和函数的集合组成,这些数据结构和函数的声明 头文件在/usr/include/objc中。这些函数支持用纯C的函数来实现和Objective-C同样的功能。还有一些函数构成了 NSObject 类方法的基础。这些函数使得访问运行时系统接口和提供开发工具成为可 能。尽管大部分情况下它们在 Objective-C 程序不是必须的,但是有时候对于 Objecitve-C 程序来说某些函 数是非常有用的。
其他:
Objective-C runtime的版本和适用平台等
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtVersionsPlatforms.html
转载请注明来自特酷吧,本文地址:http://www.tekuba.net/program/335/
推荐阅读:
IOS NSTimer的使用须知
IOS 在应用中打开另外一个应用
IOS 屏幕旋转控制详解
IOS国际化须知
想及时获取特酷吧的更新?想了解iOS,android开发最新技术动态,点击或扫描下方二维码下载“多识阅读”App,丰富的iOS,Android,Web等领域开发者博客随你订阅。
下一篇:Objective-C Runtime分析(二)-Class,Method,SEL,IMP