相關(guān)連接
iOS程序中的內(nèi)存分配 棧區(qū)堆區(qū)全局區(qū)
內(nèi)存分區(qū)
1.棧區(qū)(stack)
由編譯器自動分配并釋放,存放函數(shù)的參數(shù)值,局部變量等.
棧是系統(tǒng)數(shù)據(jù)結(jié)構(gòu),對應(yīng)線程或進程是唯一的.
有點是快速高效,缺點是有時限,數(shù)據(jù)不靈活.(先進后出)
2.堆區(qū)(heap)
由程序員分配和釋放,如果程序員不釋放,程序結(jié)束時,可能會由操作系統(tǒng)回收
比如在iOS中alloc都是存放在堆中.
優(yōu)點是靈活方便,數(shù)據(jù)適應(yīng)面廣,但是效率有一定降低.(順序隨意)
3.全局區(qū)(靜態(tài)區(qū))(static)
全局變量和靜態(tài)變量的存儲是放在一起的. 初始化的全局變量和靜態(tài)變量存放在一塊區(qū)域,未初始化的全局變量和靜態(tài)變量在相鄰的另一塊區(qū)域,程序結(jié)束后由系統(tǒng)釋放.
全局區(qū)又可以分為未初始化全局區(qū)(.bss)和初始化全局區(qū)(data段).
4.文字常量區(qū)
存放常量字符串,程序結(jié)束后由系統(tǒng)釋放
5.程序代碼區(qū)
存放函數(shù)的二進制代碼
堆棧申請后的系統(tǒng)響應(yīng)
1.棧
存儲每一個函數(shù)在執(zhí)行的時候都會向操作系統(tǒng)索要的資源,棧區(qū)就是函數(shù)運行時的內(nèi)存,棧區(qū)中的變量由編譯器負責分配和釋放,內(nèi)存隨著函數(shù)的運行分配,隨著函數(shù)的結(jié)束而釋放,由系統(tǒng)自動完成.
2.堆
1.首先應(yīng)該知道操作系統(tǒng)有一個記錄空閑內(nèi)存地址的鏈表.
2.當系統(tǒng)受到程序的申請時,會遍歷該鏈表,尋找第一個空間大于所有申請空間的堆結(jié)點,然后將該節(jié)點從空閑結(jié)點鏈表中刪除,并將該節(jié)點的空間分配給程序.
3.由于找到的堆節(jié)點的大小不一定正好等于申請的大小,系統(tǒng)會自動將多余的那部分重新放入空閑鏈表中.
申請大小的限制
1.棧
棧是向低地址擴展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存空間.棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預先規(guī)定好的,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數(shù)),如果申請的空間超過棧的剩余空間時,將會提示overflow,因此,能從棧獲得的空間較小.
2.堆
堆是向高地址擴展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域.這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址.堆的大小受限于計算機系統(tǒng)中有效的虛擬內(nèi)存.由此可見,堆獲得的空間比較靈活,也比較大...
由圖和可以當代碼塊運行結(jié)束后,,系統(tǒng)會自動釋放棧中的a,b和儲存Car對象地址的c....不會釋放堆中的對象....所以需要我們需要手動釋放把對象release掉....