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

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

移動開發 iOS
操作系統iOS 中應用程序使用的計算機內存不是統一分配空間,運行代碼使用的空間在三個不同的內存區域,分成三個段:“text segment “,“stack segment ”,“heap segment ”。

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

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

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

2.堆區(heap):一般由程序員分配釋放,若程序員不釋放,則可能會引起內存泄漏。注堆和數據結構中的堆棧不一樣,其類是與鏈表。

操作系統iOS 中應用程序使用的計算機內存不是統一分配空間,運行代碼使用的空間在三個不同的內存區域,分成三個段:“text segment “,“stack segment ”,“heap segment ”。

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

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

正如名稱所示,“stack ”是后進先出(LIFO )結構。當函數調用其他的函數時,“stack frame ”會被創建;當其他函數退出后,這個“frame ”會自動被破壞。

 “heap” 段也稱為”data” 段,提供一個保存中介貫穿函數的執行過程,全局和靜態變量保存在“heap”中,直到應用退出。

為了訪問你創建在heap 中的數據,你最少要求有一個保存在stack 中的指針,因為你的CPU 通過stack 中的指針訪問heap 中的數據。

你可以認為stack 中的一個指針僅僅是一個整型變量,保存了heap 中特定內存地址的數據。實際上,它有一點點復雜,但這是它的基本結構。

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

在iOS 操作系統的stack 段和heap 段中,你都可以創建數據對象。

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

stack 對象的創建

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

heap 對象的創建

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

例如:

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

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

責任編輯:閆佳明 來源: oschina
相關推薦

2022-03-16 08:39:19

StackHeap內存

2018-06-20 10:34:56

堆棧iOSswift

2020-11-23 08:53:34

堆Heap

2010-03-15 14:24:59

StackHeapJVM

2019-06-12 15:07:24

JVMStackHeap

2011-07-22 16:50:05

JAVA

2011-06-09 11:36:00

java

2023-09-19 22:47:39

Java內存

2010-02-02 09:43:27

C++存儲區域

2017-03-28 21:39:41

ErrorsStack trace代碼

2011-07-22 17:06:22

java

2020-08-10 14:46:30

JavaScriptStack

2024-04-30 08:38:31

C++

2020-05-27 21:13:27

JavaJVM內存

2013-07-23 06:47:55

Android內存機制Android堆和棧Android開發學習

2009-06-08 22:01:03

Java堆Java棧區別

2011-11-08 16:49:06

ZigBee協議棧Z-Stack

2023-11-01 08:07:42

.NETC#

2022-03-31 11:17:58

JavaScript數組方法

2022-04-15 07:51:12

off-heap堆外內存JVM
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人亚洲一区 | 午夜精品久久久久久久久久久久久 | www.蜜桃av | 99视频网站| 欧美一区二区三区 | 久久国产精品视频 | 亚洲国产一区二区三区四区 | 中文在线一区二区 | 欧美日韩不卡 | 99爱国产 | 精品亚洲视频在线 | 日本三级全黄三级三级三级口周 | 亚洲欧美日韩精品久久亚洲区 | 91欧美精品成人综合在线观看 | 色综合国产 | 中国美女av | 精品美女久久久久久免费 | 人人看人人干 | 国产一区二区高清在线 | 亚洲精品一区二区另类图片 | 91精品国产手机 | 91精品国产欧美一区二区 | 盗摄精品av一区二区三区 | 久久久久久久一区二区三区 | 91精品国产91久久久久久最新 | 欧美一区在线视频 | 久久国产精品视频 | 日批免费在线观看 | 狠狠狠干| 亚洲男人天堂 | 久久精品亚洲一区二区三区浴池 | 精久久| 国产清纯白嫩初高生视频在线观看 | 91亚洲视频在线 | 伊人久久精品一区二区三区 | 91av在线免费 | 成人特区| 99久久亚洲 | 国产熟熟 | 亚洲免费网址 | 亚洲精品一区二区三区在线 |