談?wù)剝?nèi)存分配

我們先看看這張圖:
內(nèi)存五大區(qū).png

內(nèi)存分區(qū):

iOS中主要是棧區(qū)(stack)、堆區(qū)(heap)、全局區(qū)/靜態(tài)區(qū)(staic) 、常量區(qū)、代碼區(qū);

一、棧區(qū)

  • 存放局部變量(臨時(shí)變量),先進(jìn)后出,一旦出了作用域就會(huì)被銷毀,函數(shù)跳轉(zhuǎn)地址,現(xiàn)場(chǎng)保護(hù)等。
  • 程序猿不需要管理?xiàng)^(qū)變量的內(nèi)存;
  • 棧區(qū)的地址從高到低分配。

二、堆區(qū)

  • 堆區(qū)的內(nèi)存分配使用的是alloc;
  • 堆區(qū)的地址是從低到高分配;
  • ARC原理是基于堆區(qū),編譯器在編譯的時(shí)候給對(duì)象自動(dòng)添加retain,release,autorelease;
  • 在ios中,堆區(qū)的內(nèi)存是應(yīng)用程序共享的,堆中的內(nèi)存分配是系統(tǒng)負(fù)責(zé)的;

三、全局區(qū)/靜態(tài)區(qū)(static):

包括兩個(gè)部分:未初始化過(guò) 、初始化過(guò);
也就是說(shuō),(全局區(qū)/靜態(tài)區(qū))在內(nèi)存中是放在一起的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域;
eg:int a;未初始化的。int a = 10;已初始化的。

四、常量區(qū)

  • 常量字符串就是放在這里,還有const常量。

五、代碼區(qū)

存放App代碼。

注意

  • 堆區(qū)需要程序猿管理內(nèi)存,是由alloc分配的內(nèi)存,一般速度比較慢,容易產(chǎn)生內(nèi)存碎片;
  • 棧區(qū)不需要程序猿管理內(nèi)存,由編譯器自動(dòng)分配并釋放,速度快;
  • 當(dāng)一個(gè)app啟動(dòng)后,代碼區(qū),常量區(qū),全局區(qū)大小都是已經(jīng)固定的,因此指向這些區(qū)的指針不會(huì)產(chǎn)生崩潰性的錯(cuò)誤,而堆區(qū)和棧區(qū)是時(shí)時(shí)刻刻變化的(堆得創(chuàng)建和銷毀,棧的彈入和彈出),所以當(dāng)使用一個(gè)指針指向這個(gè)2區(qū)里面內(nèi)存的時(shí)候,一定要注意內(nèi)存是否已經(jīng)被釋放,否則會(huì)產(chǎn)生程序崩潰(即野指針報(bào)錯(cuò))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容