iOS原理 內(nèi)存五大區(qū)

iOS原理 文章匯總

在iOS中酬土,虛擬內(nèi)存主要分為棧區(qū)堆區(qū)啃擦、全局(靜態(tài))區(qū)囊蓝、常量區(qū)代碼區(qū)令蛉,其中全局(靜態(tài))區(qū)又分為BSS區(qū)數(shù)據(jù)區(qū)聚霜。如下圖所示:

棧區(qū)(Stack)

棧區(qū)由編譯器自動分配和釋放,是一塊連續(xù)的內(nèi)存區(qū)域珠叔,主要用于存放局部變量函數(shù)的參數(shù)(id self蝎宇,SEL _cmd)

特點
  • 棧由編譯器自動分配和釋放祷安,是一塊連續(xù)的內(nèi)存區(qū)域姥芥。
  • 棧內(nèi)部以幀(Frame)的結(jié)構(gòu)進(jìn)行入棧和出棧,遵循先進(jìn)后出(FILO)原則汇鞭。
  • 棧是從高地址向低地址擴展的數(shù)據(jù)結(jié)構(gòu)凉唐,地址空間在iOS中以Ox7開頭。
  • 在運行時分配霍骄。
優(yōu)缺點
  • 優(yōu)點:因為棧是由編譯器自動分配和釋放台囱,所以不會產(chǎn)生內(nèi)存碎片,且快速高效读整。
  • 缺點:內(nèi)存大小有限制玄坦,在iOS中,主線程中棧的大小為1MB,子線程中棧的大小為512kb煎楣,在MAC OS中棧的大小為8MB豺总。(詳情可見官方文檔Threading Programming Guide)
棧幀(Frame)

棧區(qū)(stack)內(nèi)存是以幀的結(jié)構(gòu)來管理的,每次執(zhí)行一個函數(shù)择懂,都會生成新的幀(Frame)喻喳,所有的幀都按順序添加到棧中,最新生成的幀存放在最上面困曙。每次新生成一幀表伦,叫做入棧(push),每次釋放一幀慷丽,叫做出棧(pop)蹦哼,當(dāng)所有的幀都被釋放掉,整個棧也會被釋放要糊。整個過程如下圖所示:

我們通過下面的實例來具體分析:

int main() {
   int a = 10;
   int b = 20;
   return test(a, b);
}
  • 當(dāng)執(zhí)行main()函數(shù)時纲熏,系統(tǒng)生成對應(yīng)的幀并入棧,main()函數(shù)里的局部變量ab都存放在這個幀中锄俄。
  • 當(dāng)執(zhí)行到test()函數(shù)時局劲,系統(tǒng)又會生成對應(yīng)的幀并入棧,用來保存test()函數(shù)內(nèi)部的局部變量奶赠,這個新幀會疊加在最上面鱼填。
  • 執(zhí)行完test()函數(shù)后,對應(yīng)的幀被釋放毅戈,里面存放的局部變量都會被銷毀苹丸。
  • 執(zhí)行完main()函數(shù)后,對應(yīng)的幀被釋放苇经,此時所有的幀都被釋放谈跛,整個棧區(qū)(stack)也會被釋放。

堆區(qū)(Heap)

堆區(qū)由程序員分配和釋放的塑陵,也可由垃圾回收機制釋放感憾,是一塊不連續(xù)的內(nèi)存空間。主要存放:OC中使用alloc或者new創(chuàng)建的對象令花,C語言中使用malloc阻桅、callocrealloc分配的空間(C中這些需要使用free來釋放)兼都。

特點
  • 堆由程序員分配和釋放嫂沉,是一塊不連續(xù)的內(nèi)存空間。
  • 堆是類似于鏈表結(jié)構(gòu)(便于增刪扮碧,不便于查詢)趟章,遵循先進(jìn)先出(FIFO)原則杏糙。
  • 堆是從低地址向高地址拓展的數(shù)據(jù)結(jié)構(gòu),地址空間在iOS中以0x6開頭蚓土。
  • 在運行時分配宏侍。
優(yōu)缺點
  • 優(yōu)點:由于內(nèi)存空間不連續(xù),因此使用靈活方便蜀漆,隨取隨用谅河。
  • 缺點:需要手動管理內(nèi)存,速度慢确丢,且容易產(chǎn)生內(nèi)存碎片绷耍。
堆區(qū)對象的內(nèi)存訪問
Person *p = [Person alloc] init];

這個案例中,實例化的Person對象鲜侥,存在于堆區(qū)褂始,指針變量p存放于棧區(qū),p的內(nèi)存空間存放Person對象的地址描函。所以崎苗,若要訪問Person對象,需要先訪問棧區(qū)的指針變量p赘阀,再通過p存放的地址來訪問Person對象益缠。

全局(靜態(tài))區(qū)

全局區(qū)是編譯期分配的內(nèi)存空間脑奠,由系統(tǒng)管理基公,在程序啟動時由分配,程序結(jié)束時釋放宋欺,內(nèi)存空間一般以0x1開頭轰豆。在程序運行過程中,此內(nèi)存中的數(shù)據(jù)一直存在齿诞。其又分為兩部分區(qū)域:

  • BSS區(qū)(.bss):存放未初始化的全局變量靜態(tài)變量酸休。
  • 數(shù)據(jù)區(qū)(.data):存放已初始化的全局變量靜態(tài)變量

全局變量是指在運行中值可以被動態(tài)修改的變量祷杈。
靜態(tài)變量是指由static修飾的變量斑司,值不能被修改,包含全局靜態(tài)變量和局部靜態(tài)變量但汞。

常量區(qū)(.rodata)

常量區(qū)是編譯時分配的內(nèi)存空間宿刮,由系統(tǒng)管理,在程序啟動時分配私蕾,在程序結(jié)束后釋放僵缺,主要存放常量,不允許被修改踩叭,內(nèi)存空間一般以0x1開頭磕潮。

代碼區(qū)(.text)

代碼區(qū)是在編譯期分配翠胰,用來存放函數(shù)被編譯后的二進(jìn)制代碼。代碼段只允許讀操作自脯,不允許寫操作之景。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市冤今,隨后出現(xiàn)的幾起案子闺兢,更是在濱河造成了極大的恐慌,老刑警劉巖戏罢,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屋谭,死亡現(xiàn)場離奇詭異,居然都是意外死亡龟糕,警方通過查閱死者的電腦和手機桐磁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讲岁,“玉大人我擂,你說我怎么就攤上這事』貉蓿” “怎么了校摩?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長阶淘。 經(jīng)常有香客問我衙吩,道長,這世上最難降的妖魔是什么溪窒? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任坤塞,我火速辦了婚禮,結(jié)果婚禮上澈蚌,老公的妹妹穿的比我還像新娘摹芙。我一直安慰自己,他們只是感情好宛瞄,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布浮禾。 她就那樣靜靜地躺著,像睡著了一般份汗。 火紅的嫁衣襯著肌膚如雪盈电。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天裸影,我揣著相機與錄音挣轨,去河邊找鬼。 笑死轩猩,一個胖子當(dāng)著我的面吹牛卷扮,可吹牛的內(nèi)容都是我干的荡澎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼晤锹,長吁一口氣:“原來是場噩夢啊……” “哼摩幔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鞭铆,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤或衡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后车遂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體封断,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年舶担,在試婚紗的時候發(fā)現(xiàn)自己被綠了坡疼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡衣陶,死狀恐怖柄瑰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情剪况,我是刑警寧澤教沾,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站译断,受9級特大地震影響授翻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜镐作,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一藏姐、第九天 我趴在偏房一處隱蔽的房頂上張望隆箩。 院中可真熱鬧该贾,春花似錦、人聲如沸捌臊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽理澎。三九已至逞力,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間糠爬,已是汗流浹背寇荧。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留执隧,地道東北人揩抡。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓户侥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親峦嗤。 傳聞我的和親對象是個殘疾皇子蕊唐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 在iOS中,內(nèi)存主要分為棧區(qū)烁设、堆區(qū)替梨、全局區(qū)、常量區(qū)装黑、代碼區(qū)五大區(qū)域副瀑。如下圖所示 棧區(qū)(Stack) 定義 棧是系統(tǒng)...
    源本平凡閱讀 918評論 0 4
  • iOS 底層原理 文章匯總[http://www.reibang.com/p/412b20d9a0f6] 在iO...
    Style_月月閱讀 4,455評論 9 20
  • 總述 在iOS中,內(nèi)存主要分為棧區(qū)恋谭、堆區(qū)俗扇、全局區(qū)、常量區(qū)箕别、代碼區(qū)五大區(qū)域铜幽。如下圖所示: 下面分別介紹這五大區(qū) 棧區(qū)...
    含笑州閱讀 493評論 0 2
  • 在 iOS 開發(fā)中,內(nèi)存主要分為堆區(qū)串稀、棧區(qū)除抛、全局區(qū)、常量區(qū)母截、代碼區(qū)五大區(qū)域 堆(heap)區(qū) 是有程序員分配和釋放...
    遠(yuǎn)方竹葉閱讀 2,252評論 1 11
  • 介紹內(nèi)存的五大區(qū)域:棧區(qū)到忽,堆區(qū),靜態(tài)區(qū)清寇,常量區(qū)喘漏,代碼段 棧區(qū) 局部變量和方法實參 棧區(qū)特點: 存儲空間有限 . i...
    lkm_0bdc閱讀 440評論 0 2