OC关于运行时语言的问题

liniOS 2016-12-05 10:55:33
都说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倒是有用到动态获取对象,对象属性变量.不知道还有什么其他的运用场景.
小白求助各位大神解惑
...全文
221 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

29,030

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧