iOS中的堆(heap)和棧(stack)的理解

操作系統(tǒng)iOS中應(yīng)用程序使用的計(jì)算機(jī)內(nèi)存不是統(tǒng)一分配空間,運(yùn)行代碼使用的空間在三個(gè)不同的內(nèi)存區(qū)域,分成三個(gè)段:“text segment“赁咙,“stack segment”凤覆,“heap segment”。

段“text segment”是應(yīng)用程序運(yùn)行時(shí)應(yīng)用程序代碼存在的內(nèi)存段。每一個(gè)指令撮奏,每一個(gè)單個(gè)函數(shù)梯浪、過(guò)程荠藤、方法和執(zhí)行代碼都存在這個(gè)內(nèi)存段中直到應(yīng)用程序退出摊趾。一般情況下,你不會(huì)真的不得不知道這個(gè)段的任何事情秕重。

當(dāng)應(yīng)用開(kāi)始以后留荔,函數(shù)main()被調(diào)用验靡,一些空間分配在”stack”中。這是為應(yīng)用分配的另一個(gè)段的內(nèi)存空間岛杀,這是為了函數(shù)變量存儲(chǔ)需要而分配的內(nèi)存裳瘪。每一次在應(yīng)用中調(diào)用一個(gè)函數(shù)还最,“stack”的一部分會(huì)被分配在”stack”中拓轻,稱之為”frame”。新函數(shù)的本地變量分配在這里。

正如名稱所示酪劫,“stack”是后進(jìn)先出(LIFO)結(jié)構(gòu)透敌。當(dāng)函數(shù)調(diào)用其他的函數(shù)時(shí)划滋,“stack frame”會(huì)被創(chuàng)建处坪;當(dāng)其他函數(shù)退出后,這個(gè)“frame”會(huì)自動(dòng)被破壞架专。

“heap”段也稱為”data”段同窘,提供一個(gè)保存中介貫穿函數(shù)的執(zhí)行過(guò)程,全局和靜態(tài)變量保存在“heap”中部脚,直到應(yīng)用退出想邦。

為了訪問(wèn)你創(chuàng)建在heap中的數(shù)據(jù),你最少要求有一個(gè)保存在stack中的指針委刘,因?yàn)槟愕腃PU通過(guò)stack中的指針訪問(wèn)heap中的數(shù)據(jù)案狠。

你可以認(rèn)為stack中的一個(gè)指針僅僅是一個(gè)整型變量,保存了heap中特定內(nèi)存地址的數(shù)據(jù)钱雷。實(shí)際上,它有一點(diǎn)點(diǎn)復(fù)雜吹零,但這是它的基本結(jié)構(gòu)罩抗。

簡(jiǎn)而言之,操作系統(tǒng)使用stack段中的指針值訪問(wèn)heap段中的對(duì)象灿椅。如果stack對(duì)象的指針沒(méi)有了套蒂,則heap中的對(duì)象就不能訪問(wèn)钞支。這也是內(nèi)存泄露的原因。

在iOS操作系統(tǒng)的stack段和heap段中操刀,你都可以創(chuàng)建數(shù)據(jù)對(duì)象烁挟。

stack對(duì)象的優(yōu)點(diǎn)主要有兩點(diǎn),一是創(chuàng)建速度快骨坑,二是管理簡(jiǎn)單撼嗓,它有嚴(yán)格的生命周期。stack對(duì)象的缺點(diǎn)是它不靈活欢唾。創(chuàng)建時(shí)長(zhǎng)度是多大就一直是多大且警,創(chuàng)建時(shí)是哪個(gè)函數(shù)創(chuàng)建的,它的owner就一直是它礁遣。不像heap對(duì)象那樣有多個(gè)owner斑芜,其實(shí)多個(gè)owner等同于引用計(jì)數(shù)。只有heap對(duì)象才是采用“引用計(jì)數(shù)”方法管理它祟霍。

stack對(duì)象的創(chuàng)建

只要棧的剩余空間大于stack對(duì)象申請(qǐng)創(chuàng)建的空間杏头,操作系統(tǒng)就會(huì)為程序提供這段內(nèi)存空間,否則將報(bào)異常提示棧溢出沸呐。

heap對(duì)象的創(chuàng)建

操作系統(tǒng)對(duì)于內(nèi)存heap段是采用鏈表進(jìn)行管理的醇王。操作系統(tǒng)有一個(gè)記錄空閑內(nèi)存地址的鏈表,當(dāng)收到程序的申請(qǐng)時(shí)垂谢,會(huì)遍歷鏈表厦画,尋找第一個(gè)空間大于所申請(qǐng)的heap節(jié)點(diǎn),然后將該節(jié)點(diǎn)從空閑節(jié)點(diǎn)鏈表中刪除滥朱,并將該節(jié)點(diǎn)的空間分配給程序根暑。

例如:

NSString的對(duì)象就是stack中的對(duì)象,NSMutableString的對(duì)象就是heap中的對(duì)象徙邻。前者創(chuàng)建時(shí)分配的內(nèi)存長(zhǎng)度固定且不可修改排嫌;后者是分配內(nèi)存長(zhǎng)度是可變的,可有多個(gè)owner,適用于計(jì)數(shù)管理內(nèi)存管理模式缰犁。

兩類對(duì)象的創(chuàng)建方法也不同淳地,前者直接創(chuàng)建“NSString * str1=@"welcome";“,而后者需要先分配再初始化“NSMutableString * mstr1=[[NSMutableString alloc] initWithString:@"welcome"];”帅容。

(miki西游 @mikixiyou 原文鏈接:http://mikixiyou.iteye.com/blog/1595230)

再補(bǔ)充一點(diǎn)颇象,這里說(shuō)的是操作系統(tǒng)的堆和棧。

在我們學(xué)習(xí)“數(shù)據(jù)結(jié)構(gòu)”時(shí)并徘,接觸到的堆和棧的概念和這個(gè)操作系統(tǒng)中的堆和棧不是一回事的遣钳。

操作系統(tǒng)的堆和棧是指對(duì)內(nèi)存進(jìn)行操作和管理的一些方式。

“數(shù)據(jù)結(jié)構(gòu)“的堆實(shí)際上指的就是(滿足堆性質(zhì)的)優(yōu)先Queue的一種數(shù)據(jù)結(jié)構(gòu)麦乞,第1個(gè)元素有最高的優(yōu)先權(quán)蕴茴;棧實(shí)際上就是滿足先進(jìn)后出的性質(zhì)的數(shù)據(jù)或數(shù)據(jù)結(jié)構(gòu)劝评。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市倦淀,隨后出現(xiàn)的幾起案子蒋畜,更是在濱河造成了極大的恐慌,老刑警劉巖撞叽,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姻成,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡能扒,警方通過(guò)查閱死者的電腦和手機(jī)佣渴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)初斑,“玉大人辛润,你說(shuō)我怎么就攤上這事〖樱” “怎么了砂竖?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鹃答。 經(jīng)常有香客問(wèn)我乎澄,道長(zhǎng),這世上最難降的妖魔是什么测摔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任置济,我火速辦了婚禮,結(jié)果婚禮上锋八,老公的妹妹穿的比我還像新娘浙于。我一直安慰自己,他們只是感情好挟纱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布羞酗。 她就那樣靜靜地躺著,像睡著了一般紊服。 火紅的嫁衣襯著肌膚如雪檀轨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天欺嗤,我揣著相機(jī)與錄音参萄,去河邊找鬼。 笑死煎饼,一個(gè)胖子當(dāng)著我的面吹牛拧揽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼淤袜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了衰伯?” 一聲冷哼從身側(cè)響起铡羡,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎意鲸,沒(méi)想到半個(gè)月后烦周,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怎顾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年读慎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片槐雾。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夭委,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出募强,到底是詐尸還是另有隱情株灸,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布擎值,位于F島的核電站慌烧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鸠儿。R本人自食惡果不足惜屹蚊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望进每。 院中可真熱鬧汹粤,春花似錦、人聲如沸品追。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肉瓦。三九已至遭京,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泞莉,已是汗流浹背哪雕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鲫趁,地道東北人斯嚎。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親堡僻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子糠惫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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