成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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

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

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

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

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

當(dāng)應(yīng)用開始以后,函數(shù)main() 被調(diào)用,一些空間分配在”stack” 中。這是為應(yīng)用分配的另一個段的內(nèi)存空間,這是為了函數(shù)變量存儲需要而分配的 內(nèi)存。每一次在應(yīng)用中調(diào)用一個函數(shù),“stack ”的一部分會被分配在”stack” 中,稱之為”frame” 。新函數(shù)的本地變量分配在這里。

正如名稱所示,“stack ”是后進先出(LIFO )結(jié)構(gòu)。當(dāng)函數(shù)調(diào)用其他的函數(shù)時,“stack frame ”會被創(chuàng)建;當(dāng)其他函數(shù)退出后,這個“frame ”會自動被破壞。

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

為了訪問你創(chuàng)建在heap 中的數(shù)據(jù),你最少要求有一個保存在stack 中的指針,因為你的CPU 通過stack 中的指針訪問heap 中的數(shù)據(jù)。

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

簡而言之,操作系統(tǒng)使用stack 段中的指針值訪問heap 段中的對象。如果stack 對象的指針沒有了,則heap 中的對象就不能訪問。這也是內(nèi)存泄露的原因。

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

stack 對象的優(yōu)點主要有兩點,一是創(chuàng)建速度快,二是管理簡單,它有嚴(yán)格的生命周期。stack 對象的缺點是它不靈活。創(chuàng)建時長度是多大就一直是多 大,創(chuàng)建時是哪個函數(shù)創(chuàng)建的,它的owner 就一直是它。不像heap 對象那樣有多個owner ,其實多個owner 等同于引用計數(shù)。只有 heap 對象才是采用“引用計數(shù)”方法管理它。

stack 對象的創(chuàng)建

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

heap 對象的創(chuàng)建

操作系統(tǒng)對于內(nèi)存heap 段是采用鏈表進行管理的。操作系統(tǒng)有一個記錄空閑內(nèi)存地址的鏈表,當(dāng)收到程序的申請時,會遍歷鏈表,尋找第一個空間大于所申請的heap 節(jié)點,然后將該節(jié)點從空閑節(jié)點鏈表中刪除,并將該節(jié)點的空間分配給程序。

例如:

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

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

責(zé)任編輯:閆佳明 來源: oschina
相關(guān)推薦

2022-03-16 08:39:19

StackHeap內(nèi)存

2018-06-20 10:34:56

堆棧iOSswift

2020-11-23 08:53:34

堆Heap

2019-06-12 15:07:24

JVMStackHeap

2010-03-15 14:24:59

StackHeapJVM

2011-07-22 16:50:05

JAVA

2023-09-19 22:47:39

Java內(nèi)存

2011-06-09 11:36:00

java

2010-02-02 09:43:27

C++存儲區(qū)域

2017-03-28 21:39:41

ErrorsStack trace代碼

2020-08-10 14:46:30

JavaScriptStack

2011-07-22 17:06:22

java

2024-04-30 08:38:31

C++

2020-05-27 21:13:27

JavaJVM內(nèi)存

2013-07-23 06:47:55

Android內(nèi)存機制Android堆和棧Android開發(fā)學(xué)習(xí)

2009-06-08 22:01:03

Java堆Java棧區(qū)別

2011-11-08 16:49:06

ZigBee協(xié)議棧Z-Stack

2023-11-01 08:07:42

.NETC#

2022-03-31 11:17:58

JavaScript數(shù)組方法

2010-09-08 11:39:01

藍(lán)牙協(xié)議棧語音網(wǎng)關(guān)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲图片一区二区三区 | 国产精品高潮呻吟久久 | 欧美精品中文字幕久久二区 | 99在线免费视频 | www.玖玖玖 | 精品久久国产视频 | 日本不卡一区二区三区在线观看 | 日韩电影一区 | 婷婷色国产偷v国产偷v小说 | 日本不卡一区 | 亚洲国产一区二区三区 | 欧洲亚洲精品久久久久 | 国产盗摄视频 | 日韩精品一区二区三区在线播放 | 精久久久久 | 成人一区av | 午夜电影在线播放 | 午夜一级黄色片 | 欧美vide| 亚洲综合免费 | 久久亚洲国产精品日日av夜夜 | 亚洲精品视频三区 | 久久久人成影片免费观看 | 中文字幕在线观看一区 | 日本a网站 | 亚洲精品女优 | 一二三四在线视频观看社区 | 亚洲夜射 | 91精品一区 | 久久久久中文字幕 | 久久久www成人免费精品 | 国产成人一区二区三区久久久 | 国产精品成人av | 有码一区| 亚洲欧美一区二区三区国产精品 | 麻豆国产精品777777在线 | 国产精品一区一区三区 | 欧美日韩在线一区二区 | 国产精品日韩欧美一区二区三区 | 精品免费| 草久久免费视频 |