Objective-C 起源

来源:互联网 发布:淘宝买电脑主机 编辑:程序博客网 时间:2024/06/07 03:08

Objective-C 起源

Objective -C与C++、Java等面向对象语言类似,但是也有很多差别。该语言是一门“消息结构”(messaging structure)而非“函数调用”(function calling)。Objective-C语言由Smalltalk 演化而来。后者是消息型语言的鼻祖。消息与函数调用之间的区别看上去就想这样:
//Messaging(Objective-C)
Object *obj =[ [Object alloc] init];
[obj performWith:parameter1 and:parameter2];

//Function calling(C++)
Object *obj = new Object;
obj->perforn(parameter1,permeter2);`

关键区别在于:使用消息结构的语言,其运行时所应执行的代码用运行环境来决定;而使用函数调用的语言,则由编译器决定。

Objective-C的重要的工作都是由“运行期组件”而非编译器来完成。使用该语言的面向对象特性所需要的全部数据结构及函数都在运行期组件里面。举例来说,运行期组件中含有全部内存管理方法。运行期组件本质上就是一种与开发者所编写代码相链接的“动态库”期代码能吧开发者编写的所有程序粘合起来。这样只需更新运行期组件,即可提升应用程序的性能。而那种许多工作都在“编译期”完成的语言,若想获得类似的性能提升,则要重新编译应用代码。

Objective-C是C的超集,所以C语言中的所有功能在编写Objective-C代码时依然适用。因此,必须同时掌握C与Objective-C这两门语言的核心概念,方能写出高效的Objective-C代码来。其中尤为重要的要理解C语言的内存模型,这有助于理解Objective-C的内存模型及其“引用计数”机制的工作原理。若要理解内存模型,则需明白:Objective-C语言中的指针是用来指示对象的。想要申明一个变量,令其只带某个对象,可用如下语法:

NSString *someString = @"The string"

这种语法基本是照搬C语言的,它申明了一个名为someString的变量,其类型是NSString*。也就是说,此变量为指向NSString的指针。所有的Objective-C语言的对象必须这样申明,因为对象所占内存总是分配在“堆空间”中,而绝不会分配在“栈”上。不能再栈上分配Objective-C对象:

NSString stackString;//error:interface type cannot be statically allocated

someString 变量指向分配在堆里的某块内存,其中含有一个NSString对象。也就是说,如果在穿件一个变量,令其指向同一地址,那么并不是拷贝该对象,只是这两个变量会同时指向此对象:

NSString *someString = @"The string";NSString *anotherString = someString;

只有一个NSString的实例,然而这两个变量指向此对象。两个变量都是NSString*型,这说明当前“栈帧”里分配了两块内存,每块内存的大小都能容下一枚指针。这两块内存里的值都是一样,都是NSString实例的内存地址。

总结:

  1. Objective-C为C语言添加了面向对象特性,是其超集。Objective-C使用动态绑定的消息结构,也就是说,在运行时才会检查对象的类型。接收到一条消息之后,究竟应执行何种代码,有运行期环境而非编译器决定。
  2. 理解C语言的核心概念有助于写好Objective-C程序,尤其要掌握内存模型与指针。
0 0
原创粉丝点击