1.C与OC、C++的区别:

C语言的特点:面向过程

1)C语言是结构化语言,层次清晰,调试和维护比较容易

2)表现能力和处理能力比较强,可直接访问内存的物理地址

3)c语言实现对硬件的编辑,c语言课用语系统软件的开发,也可用语应用软件的开发,是集高级语言和低级语言的功能一体。

4)C语言效率高,可移植性强。

C++语言特点:面向过程又面向对象

1、在C语言的基础上进行扩充和完善,使C++兼容了C语言的面向过程特点,又成为了一种面向对象的程序设计语言;

2、可以使用抽象数据类型进行基于对象的编程;

3、可以使用多继承、多态进行面向对象的编程;

4、可以担负起以模版为特征的泛型化编程。

OC的特点:面向对象

1、Objective-C,扩展了C 语言使它具备面向对象设计的能力,例如类、消息、继承;同时在Objective-C的代码中可以有C和C++语句,它可以调用C的函数,也可以通过C++对象访问方法;

2、Objective-C可以实现底层系统编程,另一方面可以支持利用动态架构进行开发。

OC与C语言的区别:

OC里中兼容C语言的语法可以两者混合编码。 OC是面向对象的,有类,对象的概念,C语言没有类,对象的概念;C是面向过程的语言。

OC的和C++的区别:

两者最大的相同便是: 都是从 C 演化而来的面向对象语言, 两者都兼容标准C 语言.

最大不同便是:Objective C 提供了运行期动态绑定机制, 而C++ 是编译时静态绑定, 并通过嵌入类(多重继承)和虚函数(虚表)来模拟实现. Objective C 在语言层次上支持动态消息转发, 其函数调用语法为 [object function], 而且C++ 为 object->function(). 两者的语义也有不同,在 Objective C 里是说发送消息到一个对象上, 至于这个对象能不能处理消息(也就是说实现了这个函数与否)以及是处理还是转发消息都不会 crash, 而在 C++ 里是说对象进行了某个操作,如果对象没有这个操作的话,要么编译会报错(静态绑定),要么程序会 crash 掉的(动态绑定).

1、继承:Objective-C不支持多重继承,不过 Objective C 通过 proxy(代理) 和 Category(类别) 可以更优雅地实现这一特性,而C++语言支持多重继承(从侧面可以说明多重继承的效率不高);

2、函数调用:Objective-C通过互相传递消息实现函数调用,而C++直接进行函数调用

3、函数名字解析: Objective C 的函数名字解析是函数名称 + 参数名称的, 而 C++ 只包括函数名称.

4、定型:Objective-C是动态定型。所以它的类库比C++要容易操作。Objective-C 在运行时可以允许根据字符串名字来访问方法和类,还可以动态连接和添加类。而C++,对象的静态类型决定你是否可以发送消息给它。

5、接口:Objective-C采用protocol协议(非正式和正式)的形式来定义接口,而C++采用虚函数的形式来定义接口。

6、方法重载:c++中允许两个方法的名字相同,参数个数相同,但是参数类型不同,以及不同的返回值类型。而OC中不允许同一个类中两个方法有相同的名字,参数个数相同,参数类型不同。

7、Objective-C 没有 C++ 里有的构造函数和析构函数, 其对应物为 alloc-init/free .

8、Objective-C 2.0 加入了垃圾回收机制(在 iPhone 和 iPad 上不可用), 而 C++ 没有.

9、Objective-C 不允许在 Stack 上分配内存, 只能在 heap 上进行, 而 C++ 两者都允许.

10、Objective-C 不支持引用, 而 C++ 支持.

11、Objective-C 不支持模板, 而 C++ 支持.

12、Objective-C 是 Smalltalk 系的, 而 C++ 是 Simula 系的.

2.OC的动态特性

1)动态类型

即运行时再决定对象的类型;

2)动态绑定

基于动态类型,在某个实例对象被确定后,其类型便被确定了。该对象对应的属性和响应的消息也被完全确定,这就是动态绑定。在继续之前,需要明确Objective-C中消息的概念。由于OC的动态特性,在OC中其实很少提及“函数”的概念,传统的函数一般在编译时就已经把参数信息和函数实现打包到编译后的源码中了,而在OC中最常使用的是消息机制。调用一个实例的方法,所做的是向该实例的指针发送消息,实例在收到消息后,从自身的实现中寻找响应这条消息的方法。动态绑定所做的,即是在实例所属类确定后,将某些属性和相应的方法(原来没有在类中实现的,而是在运行时才需要新加入的实现)绑定到实例上。在Cocoa层,我们一般向一个NSObject对象发送-respondsToSelector:或者-instancesRespondToSelector:等来确定对象是否可以对某个SEL做出响应,而在OC消息转发机制被触发之前,对应的类的+resolveClassMethod:和+resolveInstanceMethod:将会被调用,在此时可以动态地向类或者实例添加新的方法,也即类的实现是可以动态绑定的。

3)动态加载

根据需求加载所需要的资源。

4.OC的消息机制

oc是一门动态语言,对象调用方法被称为给对象发送消息。

消息机制深入理解:

1>Objective-C是一门动态语言,其动态特性很大程度上是归因于其消息机制。

2>Objective-C采用了消息发送、消息选择器、动态类型和运行时检查等机制。

3>消息选择器

1、方法和选择器:

在OC中,selector有两重含义:一是在源代码中它代表了向对象发送消息的方法名称;二是在编译后它代表了方法名称被编译过后一个统一的标识。

编译后的方法名称有一个类型名称为SEL,所有的同名方法都共享同一个selector。 一定要注意:方法名称和方法不是一个东西。方法是method,类型是IMP,类似C语言的函数,是指对象的一段可运行的代码。  而方法名称是selector,类型是SEL,是给方法取得名字,不同的类的同名方法共享一个方法名称的编号。 (采用选择器体现了OC的多态性和动态绑定性)

2、要使用动态绑定,同名的方法必须采用同样的参数类型和返回类型。

_cmd是什么?  _cmd表示当前方法的selector,可以赋值给SEL类型的变量,可以作为参数传递。

3、运行时改变消息:在NSObject协议中定义了performSelector:方法,它起到的作用和直接调用方法是一样的,但是由于performSelector:的参数是可以替换的,因此容许在运行时改变消息。

4、Target-Action模式:

target是一个指向其它对象的指针,action是会发给target的消息。例如:[button addTarget:anObjectaction:angelforControlEvents:UIControlEventTouchUpInside]

5、获取方法的地址:

OC专门定义了一种类型IMP,可以通过IMP来获取方法地址:例如:IMP = impStudy = [student methodForSelector:@selector(study)]; 其实IMP是一个函数指针,他的定义式:typedef id (*IMP) (id, SEL, …); 这个函数有两个以上的参数,第一个是运行该函数的对象,第二个是对象的方法名,后面是这个方法所带的参数。我们可以如下调用:impStudy(student, @selector(study)); // 这个语句和[student study];的作用是一样的,区别在于使用函数指针是直接调用方法的地址,更快一点。而使用[student study];要先给student对象发送study消息,然后运行系统会去寻找消息对应的名称,再找到方法的地址,然后去运行,效率会低一点。

6、容许静态行为:OC是一门动态语言,有很大的灵活性和优点,但是也会带来一些不好的地方,有时候我们需要暂时屏蔽其动态特性。

默认的动态行为:

对象的内存空间是动态申请的,由运行时刻的类方法来创建对象实例。

对象都是动态类型的。在编译时期的源代码中,对象可以是id类型的,运行时才确定具体的类(从而确定其方法和数据结构)。 消息和方法也是动态绑定的。运行时系统会将消息中的消息选择器与消息接受者的方法进行匹配。

7、静态类型

在定义变量的时候如果我们不使用id,而使用具体的某一类的名称,我们称为静态类型:例如:id person; // 动态类型    Student *stu; // 静态类型

静态类型给了编译器有关对象更多的信息,相比单纯的采用id类型,有以下不同点:1.容许编译期间进行类型检查 2.使代码更具可读性 3.静态类型的对象不用遵循“同名的方法必须具备同样的参数和返回值”的规则 4.可以通过结构体指针直接访问对象的实例变量

8、运行时消息检查:

当对象接收到一条它无法实现的消息的时候,会产生错误。因为消息是在运行时刻才发出。我们可以用respondsToSelector:方法来检测一个对象时候能响应某条消息。

9、消息传递:

有两个对象A、B,当给A发送一条消息,但是A无法处理的时候它会不会传递给B对象呢?答案是肯定的。

在添加消息转发功能前,必须要覆盖两个方法:methodSignatureForSelector: // 为另一个类实现消息创建一个有效的方法签名forwardInvocation: // 将选择器转发给一个真正实现该消息的对象。

最新文章

  1. [翻译]ES 提案: global
  2. EF 延迟加载和预先加载
  3. c#-1 数据结构 定义相关 界面交互数据 Model层
  4. [转]uboot中SPL作用
  5. android录像增加时间记录(源码里修改)
  6. 通用 PE 工具箱1.9.6(XP内核)by Uepon(李培聪)
  7. Centos更新yum packet源
  8. EMVTag系列4《5A 应用主账号》
  9. foreach的指针问题
  10. [Angular2 Router] CanDeactivate Route Guard - How To Confirm If The User Wants To Exit A Route
  11. 【Qt】Qt Creator介绍【转】
  12. [转载]C# Double toString保留小数点方法
  13. 如何给你的VS2010添加创建文件后的头注释
  14. Codevs 2611 观光旅游(floyed最小环)
  15. 斜率优化(CDQ分治,Splay平衡树):BZOJ 1492: [NOI2007]货币兑换Cash
  16. Spring之MVC模块
  17. DirectX11--深入理解HLSL常量缓冲区打包规则
  18. OO第一次博客作业--第一单元总结
  19. private、public、protected和默认
  20. Fluent动网格【7】:网格节点运动

热门文章

  1. vscode 输出面板字符编码问题
  2. HDU 6010 - Daylight Saving Time
  3. parted分区命令
  4. 搭建自己的博客(七):使用bootstrap框架美化导航栏
  5. LSTM-航班人数预测
  6. 【概率论】5-2:伯努利和二项分布(The Bernoulli and Binomial Distributions)
  7. bochs调试命令
  8. 三十一、Gawk基础入门
  9. lucene正向索引(续)——每次commit会形成一个新的段,段"_1"的域和词向量信息可能存在"_0.fdt"和"_0.fdx”中
  10. 面试题小议---BY gremount