OC中棧區(qū)與堆區(qū)的內(nèi)存概念解析

棧區(qū)是先進后出贯溅,隊列是先進先出。
棧區(qū)就相當于玻璃杯躲查,往玻璃杯里放奧利奧它浅,第一塊放入的奧利奧,肯定是最后一個拿出來镣煮。
隊列就相當于掉了底的玻璃杯姐霍,最先放入的,必定最先掉出來典唇。
網(wǎng)上有個更絕的比喻:隊列是吃多了拉镊折,棧區(qū)是吃多了吐。
這里解析的是棧區(qū)和堆區(qū)的內(nèi)存問題蚓聘,說到了棧區(qū)自然引出隊列腌乡,捎帶提一筆。
言歸正傳夜牡,以下面這個非常簡單的c語言程序為例:



變量 i 和 j 就是保存在棧區(qū)里的
有一句話如是說:在OC中,默認不帶*號的都是保存在棧區(qū)的侣签。
在這里塘装,變量名其實就是變量保存在棧區(qū)的內(nèi)存地址的別名。
那么影所,這個程序運行時在棧區(qū)是如何出入的呢蹦肴?

程序在棧區(qū)的出入步驟:
程序運行執(zhí)行main函數(shù),i首先進入棧區(qū)猴娩,位于最底部阴幌。然后j進入棧區(qū),printf調(diào)用函數(shù)sum(i, j)緊隨其后進入棧區(qū)卷中。
函數(shù)sum(int x, int y)中的參數(shù)矛双,從右到左依次進入棧區(qū)。先是y再是x蟆豫。
棧區(qū)存儲樣式:



當程序運行結(jié)束后议忽,棧區(qū)內(nèi)的所有元素會從上到下的依次出棧,棧會恢復到原始狀態(tài)十减。
棧的先進后出方式栈幸,會特別整齊的存取愤估,不會產(chǎn)生內(nèi)存碎片。

現(xiàn)在加入線程概念:每條主線程為1M內(nèi)存速址,每條子線程為512K內(nèi)存
每個線程都會對應一個棧區(qū)玩焰!
當程序開展了多條線程的時候,每個線程都會開辟一塊棧區(qū)芍锚,如下圖所示:



當線程執(zhí)行完畢之后震捣,各個線程棧區(qū)會依次清除掉。
所以:對于系統(tǒng)來說闹炉,給線程分配棧區(qū)內(nèi)存只需要分配512kb的倍數(shù)即可蒿赢,
分配出來的這塊內(nèi)存空間作為多線程整體的棧區(qū),來管理多線程渣触。
如此一來羡棵,內(nèi)存會被管理的井井有條,速度飛快嗅钻。

堆區(qū)
堆區(qū)是由系統(tǒng)通過鏈表管理維護的皂冰,所有應用程序共享的一塊內(nèi)存空間。包括內(nèi)存+虛擬內(nèi)存(磁盤緩存)
程序運行時堆區(qū)的內(nèi)部操作养篓,以及引發(fā)內(nèi)存泄漏的原因:
創(chuàng)建一個新的對象時秃流,對象p指針存放在棧區(qū),p將指向在堆區(qū)開辟的一塊存儲空間Person



在程序結(jié)束之前柳弄,p對象必須release舶胀,不然系統(tǒng)不知道釋放堆區(qū)的Person內(nèi)存。
如果p對象沒有release碧注,只是p=nil; 就是p指針指向了堆區(qū)地址為0的地方嚣伐,那么原來的Person永遠無法再次訪問,而且也無法釋放掉萍丐。
堆是所有程序共享的內(nèi)存轩端,當N個這樣的內(nèi)存得不到釋放,堆區(qū)會被擠爆逝变,程序立馬癱瘓基茵。這就是內(nèi)存泄漏。
這里要知道的是:系統(tǒng)在堆區(qū)只會記錄某一個區(qū)域被使用了壳影,并不會管你是什么類型的(匿名訪問)拱层。
我寫了一段對象與堆區(qū)的對話,來說明這個現(xiàn)象:
某程序的對象p:喂态贤!堆舱呻!我有個Person,你給我記錄一下。
堆:尼瑪箱吕,今天我碰到了N個Person了芥驳,別瞎掰活,直接說要多大空間茬高!
p:100kb
堆:已開辟兆旬。
堆就跟小旅館一樣,我管你是男女老幼怎栽,直接說要什么價位的房子丽猬。
那么,既然是匿名訪問熏瞄,堆不管你的類型了脚祟,那怎么區(qū)分這塊內(nèi)存是什么類型的呢?
簡單:什么類型指向這塊內(nèi)存强饮,這塊內(nèi)存就是什么類型的由桌。
程序示例:
定義一個Person類



在main.m文件中利用Person類創(chuàng)建一個對象,這個對象即便是定義為NSString類型邮丰,在編譯的時候也不會報錯行您,會有警告

這就說明:堆中開辟的內(nèi)存自身并不強調(diào)類型,而是受到棧區(qū)中對象類型的左右剪廉。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末娃循,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子斗蒋,更是在濱河造成了極大的恐慌捌斧,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吹泡,死亡現(xiàn)場離奇詭異骤星,居然都是意外死亡,警方通過查閱死者的電腦和手機爆哑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舆吮,“玉大人揭朝,你說我怎么就攤上這事∩剑” “怎么了潭袱?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锋恬。 經(jīng)常有香客問我屯换,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任彤悔,我火速辦了婚禮嘉抓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晕窑。我一直安慰自己抑片,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布杨赤。 她就那樣靜靜地躺著敞斋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疾牲。 梳的紋絲不亂的頭發(fā)上植捎,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音阳柔,去河邊找鬼焰枢。 笑死,一個胖子當著我的面吹牛盔沫,可吹牛的內(nèi)容都是我干的医咨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼架诞,長吁一口氣:“原來是場噩夢啊……” “哼拟淮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谴忧,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤很泊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后沾谓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體委造,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年均驶,在試婚紗的時候發(fā)現(xiàn)自己被綠了昏兆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡妇穴,死狀恐怖爬虱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腾它,我是刑警寧澤跑筝,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站瞒滴,受9級特大地震影響曲梗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一虏两、第九天 我趴在偏房一處隱蔽的房頂上張望愧旦。 院中可真熱鬧,春花似錦碘举、人聲如沸忘瓦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耕皮。三九已至,卻和暖如春蝙场,著一層夾襖步出監(jiān)牢的瞬間凌停,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工售滤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留罚拟,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓完箩,卻偏偏與公主長得像赐俗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子弊知,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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