OC語(yǔ)言是C語(yǔ)言的超集,所以先了解C語(yǔ)言的內(nèi)存模型的內(nèi)存管理會(huì)有很大的幫助拐揭。C語(yǔ)言的內(nèi)存模型分為5個(gè)區(qū):棧區(qū)撤蟆、堆區(qū)、靜態(tài)區(qū)堂污、常量區(qū)家肯、代碼區(qū)
。每個(gè)區(qū)存儲(chǔ)的內(nèi)容如下:
1盟猖、棧區(qū)
:存放函數(shù)的參數(shù)值息楔、局部變量等寝贡,由編譯器自動(dòng)分配和釋放,通常在函數(shù)執(zhí)行完后就釋放了值依,其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧圃泡。棧內(nèi)存分配運(yùn)算內(nèi)置于CPU的指令集,效率很高愿险,但是分配的內(nèi)存量有限颇蜡,比如iOS中棧區(qū)的大小是2M。
2辆亏、堆區(qū)
:就是通過(guò)new风秤、malloc、realloc分配的內(nèi)存塊扮叨,編譯器不會(huì)負(fù)責(zé)它們的釋放工作缤弦,需要用程序區(qū)釋放。分配方式類似于數(shù)據(jù)結(jié)構(gòu)中的鏈表彻磁。在iOS開(kāi)發(fā)中所說(shuō)的“內(nèi)存泄漏”說(shuō)的就是堆區(qū)的內(nèi)存碍沐。
3、靜態(tài)區(qū)
:全局變量和靜態(tài)變量(在iOS中就是用static修飾的局部變量或者是全局全局變量)的存儲(chǔ)是放在一塊的衷蜓,初始化的全局變量和靜態(tài)變量在一塊區(qū)域累提,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結(jié)束后磁浇,由系統(tǒng)釋放斋陪。
4、常量區(qū)
:常量存儲(chǔ)在這里置吓,不允許修改无虚。
5、代碼區(qū)
:存放函數(shù)體的二進(jìn)制代碼衍锚。