OC消息机制和动态运行时

Posted by Dan July 29th  原创文章,欢迎转载,转载请注明原创地址。


我们在初学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));

 正确的理解应该是

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值