我们在初学Objective-C时,都会觉得ObjC中的方法调用和其他语言的Function Call 差不多,只是在OC中,方法调用用消息传递这一概念来代替。
实际上,这里忽略了包含着ObjC中最重要的特性-基于Runtime的动态特性。而ObjC的动态特性是基于Runtime的消息传递机制,在ObjC中,消息的传递都是动态的。
ObjC作为一门面向对象的语言,自然具备面向对象的语言特性(封装、继承、多态)。同时它也具备静态语言的特性,又有动态特性(动态类型、动态绑定和动态加载)。
基于Runtime的动态特性
在苹果的官方文档中,对Runtime的介绍如下:
The Objective-C language defers as many decisions as it can from compile time and link time to runtime. Whenever possible, it does things dynamically. This means that the language requires not just a compiler, but also a runtime system to execute the compiled code. The runtime system acts as a kind of operating system for the Objective-C language; it’s what makes the language work.
ObjC 面向Runtime的语言,它会尽可能地把决策从编译时和连接时推迟到运行时(简单来说,就是编译后的文件不全是机器指令,还有一部分中间代码,在运行的时候,通过Runtime再把需要转换的中间代码在翻译成机器指令)这使得ObjC有着很大的灵活性。比如:
1、动态的确定类型
2、我们可以动态的确定消息传递的对象
3、动态的给对象增加方法的实现 等等
那么,ObjC是如何实现这一灵活性?
ObjC Runtime库是开源的,可从这里下载 http://opensource.apple.com/
基于Runtime的消息传递机制
ObjC之所以说是面向Runtime的语言,最重要的特征是其消息传递机制。
什么是消息传递?消息传递不就和C语言的函数调用一个意思么。。
在C语言中,我们调用函数时,必须先声明函数(或者自上而下),而实际上,声明函数就是获取函数地址,调用函数就是直接跳到地址执行,代码在被编译器解析、优化后,便是成为一堆汇编代码,然后连接各种库,完了生成可执行的代码(即是静态的)。
在ObjC中,首先要搞清楚为什么不用Function Call 而用 Messaging 呢?一般调用函数(方法),讲的就是object对象,比如说:
person.say();
这里表示的就是person对象调用了say函数
而Messaging则是从Runtime的角度上 比如说
[receiver doSomething];
编译后,则是成
objc_msgsend(receiver @selector(doSomething));
正确的理解应该是
OC消息机制和动态运行时
最新推荐文章于 2021-01-31 13:02:15 发布
Posted by Dan July 29th 原创文章,欢迎转载,转载请注明原创地址。