ios内存概述
iOS內存管理
在iOS中內存分為五大區域:棧去、堆區、全局區、常量區、代碼區
-
棧內存
1、高地址向低地址擴展。
2、一塊連續的內存區域,遵循先進后出的原則。
3、運行時分配,在iOS中以0x7開頭
4、由編譯器自動分配并釋放
5、局部變量、函數參數 -
堆內存
1、低地址向高地址擴展
2、不連續的內存區域,類似于鏈表,遵循先進先出的原則。
3、運行時分配的,在iOS中以0x6開頭
4、程序員動態分配和釋放的
5、訪問堆中內存時,一般需要通過對象讀取到棧區的指針地址,然后通過指針地址訪問堆區 -
全局區/靜態區
1、編譯時期分配的內存空間
2、在iOS中一般以0x1開頭
3、可讀可寫區域
4、分為BSS區和DATA區。
BSS區:未初始化的全局變量和靜態變量。
DATA區:已初始化的全局變量和靜態變量。
(全局變量是指變量值可以在運行時被動態修改,而靜態變量是static修飾的變量,包含靜態局部變量和靜態全局變量) -
常量區
1、編譯時期分配的內存空間
2、只讀區域
3、主要存放:已經使用且沒有指向的字符串常量
4、在程序運行前提前分配內存 -
代碼區
1、編譯時分配
2、只讀區域
3、主要存放:程序運行的代碼
函數棧(棧幀)
函數在運行中且未完成時期占用的一塊獨立的連續內存區域
每一個線程都有專用的棧空間,該棧空間可以在線程期間自由使用,當前線程的函數共享改棧空間,每一個函數使用的棧空間是一個棧幀,所有的棧幀組成了這個線程完整的棧
函數的調用是發生在棧上,每一個函數的相關信息(局部變量,調用記錄等)都存儲在一個棧幀中,每執行一次函數調用就會生成一個新的棧幀,然后將其壓入函數棧,當函數執行結束時,則將函數對應的棧幀出棧并釋放
堆棧溢出
一般情況下我們是不需要考慮堆棧的大小問題,但是堆棧不是無上限的,過多的遞歸會導致棧溢出,過多的alloc會導致堆溢出
預付堆棧溢出的方法:
避免層次過深得遞歸調用
不要使用過多的局部變量,控制局部變量大小
避免占用大內存的對象的分配,及時釋放
在適當情況下調用系統API修改線程的堆棧大小
總結
- 上一篇: 《*** 经济思想学习纲要》学习辅导
- 下一篇: Arduino使用高感度声音模块