程序运行时的内存空间可以概括为以下:
代码区:存放函数的二进制代码
全局数据:包含程序运行期间不会被销毁的数据,如:静态数据、全局变量、常量
栈:由编译器自动分配,存放函数的参数、局部变量等
堆:程序猿手动分配和释放(我们alloc 一个对象就是在堆中分配一块内存),现在iOS的ARC机制由编译器自动添加引用计数操作代码来达到释放堆内存的目的
二
在C语言中,当程序运行执行某个函数时,当前CPU的PC指针会直接跳到代码区的某个函数地址从而执行函数
而在OC中,一个很重要概念的就是消息转发,当我们向某个对象发送一个消息(也即是我们通常讲的调用某个方法),此时CPU并不知道我们要执行的是代码区的某个函数地址,而是要经过runtime机制找到函数的地址,从而CPU跳到找到的地址去执行代码。
此机制主要就是objc_msgSend,简单概括就是找到IMP(函数在代码段的真是地址)并调用,伪代码如下:
id objc_msgSend(id self, SEL _cmd, ...) {
Classclass=object_getClass(self);
IMP imp = class_getMethodImplementation(class,_cmd);
return imp ? imp(self, _cmd, ...) :0;
}