程序運行時的內(nèi)存空間可以概括為以下:
代碼區(qū):存放函數(shù)的二進制代碼
全局數(shù)據(jù):包含程序運行期間不會被銷毀的數(shù)據(jù)键思,如:靜態(tài)數(shù)據(jù)础爬、全局變量、常量
棧:由編譯器自動分配吼鳞,存放函數(shù)的參數(shù)看蚜、局部變量等
堆:程序猿手動分配和釋放(我們alloc 一個對象就是在堆中分配一塊內(nèi)存),現(xiàn)在iOS的ARC機制由編譯器自動添加引用計數(shù)操作代碼來達到釋放堆內(nèi)存的目的
二
? ? ? 在C語言中赖条,當程序運行執(zhí)行某個函數(shù)時失乾,當前CPU的PC指針會直接跳到代碼區(qū)的某個函數(shù)地址從而執(zhí)行函數(shù)
? ? ? 而在OC中,一個很重要概念的就是消息轉發(fā)纬乍,當我們向某個對象發(fā)送一個消息(也即是我們通常講的調(diào)用某個方法),此時CPU并不知道我們要執(zhí)行的是代碼區(qū)的某個函數(shù)地址裸卫,而是要經(jīng)過runtime機制找到函數(shù)的地址仿贬,從而CPU跳到找到的地址去執(zhí)行代碼。
此機制主要就是objc_msgSend墓贿,簡單概括就是找到IMP(函數(shù)在代碼段的真是地址)并調(diào)用茧泪,偽代碼如下:
id objc_msgSend(id self, SEL _cmd, ...) {
? ? Classclass=object_getClass(self);
? ? IMP imp = class_getMethodImplementation(class,_cmd);
? ? ?return imp ? imp(self, _cmd, ...) :0;
}