liniOS
liniOS
2016-12-05 14:46

OC关于运行时语言的问题

  • oc
  • 运行时
  • runtime
  • ios

都说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条回答

为你推荐