日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

IOS- 堆和栈 详解

發(fā)布時(shí)間:2025/5/22 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IOS- 堆和栈 详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Objective-C的對(duì)象在內(nèi)存中是以堆的方式分配空間的,并且堆內(nèi)存是由你釋放的,即release

棧由編譯器管理自動(dòng)釋放的,在方法中(函數(shù)體)定義的變量通常是在棧內(nèi),因此如果你的變量要跨函數(shù)的話就需要將其定義為成員變量。

1.棧區(qū)(stack):由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量等值。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。

2.堆區(qū)(heap):一般由程序員分配釋放,若程序員不釋放,則可能會(huì)引起內(nèi)存泄漏。注堆和數(shù)據(jù)結(jié)構(gòu)中的堆棧不一樣,其類是與鏈表。

操作系統(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)用開始以后,函數(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"];?”。

轉(zhuǎn)載于:https://www.cnblogs.com/mcj-coding/p/3561804.html

總結(jié)

以上是生活随笔為你收集整理的IOS- 堆和栈 详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。