Objective-C使用“消息结构”而非“函数调用”。Objective-C语言由SmallTalk演化而来,后者是消息型语言的鼻祖。消息和函数调用之间的区别像:
//Messaging (Objective-C)
Object *obj = [Object new];
[obj performWith:parameter1 and:parameter2];
//Function calling(C++)
Object *obj = new Object;
obj->perform(parameter1, parameter2);
使用消息结构的语言,运行时所应执行的代码由运行环境来决定;而是用函数调用的语言,则由编译器决定。
采用消息结构的语言,无论是否多态,总是在运行时才会去查找所要执行的方法。编译器甚至不关心接收消息的对象是何种类型。
Objective-C的重要工作都由“运行期组件”而非编译器来完成。使用Objective-C的面向对象特性所需的全部数据结构及函数都在运行期组件里面。运行期组件包含有全部内存管理方法。运行期组件本质上就是一种与开发者所编代码相连接的“动态库”(dynamic library),其代码能把开发者编写的所有程序粘合起来。这样的话,只需要更新运行期组件,即可提升应用程序性能。
Objective-C是C的“超集“,Objective-C语言中的指针是用来指示对象的,想要声明一个变量,令其指代某个对象。不能在栈上分配Objective-C对象。
分配在堆中的内存必须直接管理,而分配在栈上用于保存变量的内存则会在其栈帧弹出时自动清理。Objective-C将堆内存管理抽象出来了。不需要用malloc及free来分配或释放对象所占内存。Objective-C运行期环境把这部分工作抽象为一套内存管理架构,名叫”引用计数“;
OC中会遇到不含*的变量,它们可能会使用“栈空间”,它们保存的不是OC对象,比如CoreGraphics中的CGRect。