
內(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ò))