02. oc语言是动态语言

 参照着知乎上大神们给的解释,(https://www.zhihu.com/question/19918532)自己要总结下知识:

自己初级并没有理解 动态、静态、强类型、弱类型 语言的这些含义,区分。 趁着近来有些零散的时间,赶紧补充下自己……

  1. 动态语言

   是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。

   比如众所周知的ECMAScript(JavaScript)便是一个动态语言。 除此之外如Ruby、Python等也都属于动态语言。

 2 . 静态语言

   与动态类型语言正好相反,在编译时,需要确定类型的语言。即写程序时需要明确声明变量类型。如C/C++、Java、C#等。

   静态语言 对类型有着绝对的要求,所以能非常棒的被约束!

 3 . 强类型语言

  一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。强类型定义语言是类型安全的语言。

  4. 弱类型语言

  数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。
  强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。

  像vb,php等就属于弱类型语言

 

综上所述:

  oc 语言中,如id类型 应该是标致性的: 在运行是才确定类型的;

  同时 oc 类型 是需要转化才能改变类型的,可以举个例子 ,string.format (%d,number);

 

确定了oc  是动态的 强类型的编译语言,忍不住,就要研究它的动态特点了:::::

OC的动态特性表现为了三个方面:动态类型、动态绑定、动态加载。之所以叫做动态,是因为必须到运行时(run time)才会做一些事情。

(1)动态类型

动态类型,说简单点就是id类型。动态类型是跟静态类型相对的。像内置的明确的基本类型都属于静态类型(int、NSString等)。静态类型在编译的时候就能被识别出来。所以,若程序发生了类型不对应,编译器就会发出警告。而动态类型就编译器编译的时候是不能被识别的,要等到运行时(run time),即程序运行的时候才会根据语境来识别。所以这里面就有两个概念要分清:编译时跟运行时。

id obj = someInstance;
if ([obj isKindOfClass:someClass]) { someClass *classSpecifiedInstance = (someClass *)obj; }
if ([obj isMemberofClass:someClass])
{
    someClass *classSpecifiedInstance = (someClass *)obj;
}

(2)动态绑定

来看看“函数”@selector/SEL吧,对于其他一些静态语言,比如c++,一般在编译的时候就已经将将要调用的函数的函数签名都告诉编译器了。静态的,不能改变。

而在OC中,其实是没有函数的概念,我们叫“消息机制”,所谓的函数调用就是给对象发送一条消息。这时,动态绑定的特性就来了。OC可以先跳过编译,到运行的时候才动态地添加函数调用,在运行时才决定要调用什么方法,需要传什么参数进去。

这就是动态绑定,要实现他就必须用SEL变量绑定一个方法。最终形成的这个SEL变量就代表一个方法的引用。这里要注意一点:SEL并不是C里面的函数指针,虽然很像,但真心不是函数指针。SEL变量只是一个整数,他是该方法的ID。以前的函数调用,是根据函数名,也就是字符串去查找函数体。但现在,我们是根据一个ID整数来查找方法,整数的查找字自然要比字符串的查找快得多!所以,动态绑定的特定不仅方便,而且效率更高。

动态绑定所做的,即是在实例所属类确定后,将某些属性和相应的方法绑定到实例上。这里所指的属性和方法当然包括了原来没有在类中实现的,而是在运行时才需要的新加入的实现。在Cocoa层,我们一般向一个NSObject对象发送-respondsToSelector:或者-instancesRespondToSelector:等来确定对象是否可以对某个SEL做出响应,而在OC消息转发机制被触发之前,对应的类的+resolveClassMethod:和+resolveInstanceMethod:将会被调用,在此时有机会动态地向类或者实例添加新的方法,也即类的实现是可以动态绑定的。

 

(3)动态加载

根据需求加载所需要的资源,这个很容易理解;做个最简单的说明。因为 Retina 屏幕的出现, 图片经常要准备 @2x ,@3x,但是我们在使用的时候,并没有代码要求使用 2倍 3倍图,系统会动态自动完成加载

 

 

        

posted @ 2017-06-20 15:46  user_bo  阅读(360)  评论(0编辑  收藏  举报