OC关于运行时语言的问题

都说OC是动态运行时语言.这是OC的一大亮色.看网上的介绍说OC的动态特性表现为了三个方面:动态类型、动态绑定、动态加载。
我对这个动态类型、动态绑定有点疑问. 动态类型:就是编译器编译的时候是不能被识别的,要等到运行时(run time),即程序运行的时候才会根据语境来识别。 动态绑定(dynamic binding)貌似比较难记忆,但事实上很简单,只需记住关键词@selector/SEL即可。先来看看“函数”,对于其他一些静态语言,比如 c++,一般在编译的时候就已经将将要调用的函数的函数签名都告诉编译器了。静态的,不能改变。而在OC中,其实是没有函数的概念的,我们叫“消息机 制”,所谓的函数调用就是给对象发送一条消息。这时,动态绑定的特性就来了。OC可以先跳过编译,到运行的时候才动态地添加函数调用,在运行时才决定要调 用什么方法,需要传什么参数进去。
假设:加入定义了一个Person类,里面只有一个对象方法是"run"方法.加入我实例化一个person对象,然后我调用"eat"这种无中生有的方法.然后运行,编译器是能查出来,并且警告的啊.
问题1:OC可以先跳过编译,到运行的时候才动态地添加函数调用,在运行时才决定要调 用什么方法.那按道理,我的假设编译时应该不报警告啊??
问题2:这种动态运行时到底算什么优点,是编译的时候更快吗还是?全部是静态类型有什么缺点?
问题3:我看runtime有个函数是0bjc_msgSend 我们平时调用方法时候,底层就是通过此函数来发送消息.那我们实际工作中有什么情况下最好要用"0bjc_msgSend "函数来调用某个方法,而不是正常的通过对象或类来调用呢?看了网上介绍的runtime,大部分都是介绍runtime各个函数的作用,很少说哪里需要用到runtime.MJExtension倒是有用到动态获取对象,对象属性变量.不知道还有什么其他的运用场景.
小白求助各位大神解惑

1个回答

动态调用非但不快,而且更慢。动态运行的优点是更简单的元数据(metadata)解析/有利于领域特定语言代码的编写。比如说,运行时得到一个xml/json的数据,将它转换为一个对象,直接用编程语言的对象去操作它。
再比如说,和脚本语言交互,脚本语言的对象肯定是你在编译期间不存在的,那么这些东西如果不能用动态语法调用,就要写很繁琐的代码实现了。

使用动态的原则是,能不用它就不用,因为它极端浪费性能并且失去了编译器对代码类型检查的约束。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问