算了算,学习IOS已经有一段时间了。今天花了点时间思考一下OC的语言特性,让本身的心不要那么浮躁,注重基础,回归本源。c++
OC作为一门面向对象语言,天然具备面向对象的语言特性,如封装、继承、多态。他具备静态语言的特性(如C++),又有动态语言的效率(动态绑定、动态加载等)。总体来讲,确实是一门不错的编程语言。编程
如今,让我来想一想OC的动态语言特性。OC的动态特性表现为了三个方面:动态类型、动态绑定、动态加载。之因此叫作动态,是由于必须到运行时(run time)才会作一些事情。编程语言
(1)动态类型函数
动态类型,说简单点就是id类型。动态类型是跟静态类型相对的。像内置的明确的基本类型都属于静态类型(int、NSString等)。静态类型在 编译的时候就能被识别出来。因此,若程序发生了类型不对应,编译器就会发出警告。而动态类型就编译器编译的时候是不能被识别的,要等到运行时(run time),即程序运行的时候才会根据语境来识别。因此这里面就有两个概念要分清:编译时跟运行时。post
(2)动态绑定学习
动态绑定(dynamic binding)貌似比较难记忆,但事实上很简单,只需记住关键词@selector/SEL便可。先来看看“函数”,对于其余一些静态语言,好比 c++,通常在编译的时候就已经将将要调用的函数的函数签名都告诉编译器了。静态的,不能改变。而在OC中,实际上是没有函数的概念的,咱们叫“消息机 制”,所谓的函数调用就是给对象发送一条消息。这时,动态绑定的特性就来了。OC能够先跳过编译,到运行的时候才动态地添加函数调用,在运行时才决定要调 用什么方法,须要传什么参数进去。这就是动态绑定,要实现他就必须用SEL变量绑定一个方法。最终造成的这个SEL变量就表明一个方法的引用。这里要注意 一点:SEL并非C里面的函数指针,虽然很像,但真心不是函数指针。SEL变量只是一个整数,他是该方法的ID。之前的函数调用,是根据函数名,也就是 字符串去查找函数体。但如今,咱们是根据一个ID整数来查找方法,整数的查找字天然要比字符串的查找快得多!因此,动态绑定的特定不只方便,并且效率更 高。指针
(3)动态加载对象
就是根据需求动态地加载资源。我对动态加载比较陌生,因此就没什么可总结的啦。等之后慢慢完善blog