六 記憶體管理

2021-10-01 07:59:44 字數 2858 閱讀 5079

殭屍物件:已經被釋放的物件。 再使用物件就會報錯。

野指標:乙個指標指向被釋放的物件的記憶體。

前提:相對於mrc下,一次 retain / alloc 對應一次release,經常需要手動release進行記憶體管理,防止記憶體洩漏。從而引出自動釋放池

自動釋放池

自動釋放池是以棧為節點通過雙向鍊錶組合而成,與執行緒一一對應

// autoreleasepool 自動釋放池

@autoreleasepool

// 自動釋放池被銷毀,所有物件被release一次,p被釋放。

實現原理:

autorelease 經過編譯器後被改寫為objc_autoreleasepoolpush 和 objc_autoreleasepoolpop

objc_autoreleasepoolpush內部會呼叫c++的autoreleasepage::push方法

objc_autoreleasepoolpop內部會呼叫c++的autoreleasepage::pop方法

乙個物件如array何時被釋放?

在每次runloop即將結束時呼叫autoreleasepage::pop方法,把array物件呼叫release方法進行釋放。

注意點:

1)物件呼叫autorelease方法,僅僅是將物件放到引用釋放池,引用計數不會改變。只有當自動釋放池被銷毀,池內物件引用計數才會 -1。

2)自動釋放池被銷毀,所有物件僅僅是被release一次,並不代表被釋放。只有物件引用計數值為0,才算被釋放。

3)自動釋放池可以有多個,並且自動釋放池可以巢狀。

多個自動釋放池以棧的形式儲存。 當物件呼叫autorelease方法,是將物件放在棧頂的釋放池中

應用場景:

可以使用在for迴圈載入記憶體較大的類中使用,如 for迴圈中alloc

但是需要注意,把 autoreleasepool 寫在迴圈內部,保證每次迴圈記憶體都可以保證釋放,防止記憶體飆公升

// 1. autoreleasepool 寫在迴圈外部,適得其反,記憶體突增  

@autoreleasepool

}// 此處才會釋放,已經建立了99個物件

// 2. autoreleasepool 寫在迴圈內部,一次迴圈一次物件的**

for(int i; i<

99; i++

)// 此處釋放

}

概念

mrc: manual refrence count,手動引用計數,程式設計師對物件的記憶體進行管理。

arc: auto refrence count 自動引用計數,編譯器自動進行物件的記憶體管理。 區別

mrc通過使用retain /release /autorelease 等方法控制物件的引用計數值,從而實現物件的記憶體管理。當引用計數值為0,物件被釋放。

arc通過編譯器與runtime合作自動進行物件的記憶體管理,只要有乙個強指標引用該物件,物件就不會被釋放。

注:1. arc不能使用release等mrc的方法,而使用strong/weak等自己的方法。

2. arc下建立的物件預設是強指標,當乙個物件如果沒有強指標即使有若指標也會被釋放。

補充:mrc轉arc(xcode選單欄 edit -> convert -> to oc arc)

問:mrc下給成員變數賦值使用 set方法 還是下劃線訪問成員變數賦值?

答:使用set方法即點語法進行賦值

因為點語法進行賦值在mrc下會重寫以下set方法進行記憶體管理,而下劃線賦值則僅僅是簡單的賦值,可能會造成記憶體洩漏。

@property

(noatomic,retain) id obj;-(

void

)setobj:

(id)obj // 1. 快速建立乙個物件

return _obj;

}

單例在mrc和arc下

單例:在程式執行期間,保證乙個類無論建立多少次,都只會產生乙個例項物件。

arc下,單例的**包含四部分

+

(instancetype)shareinstance // 1. 快速建立乙個物件

static person *_instance = nil;

+(instancetype)allocwithzone:

(struct _nszone *

)zone //2. alloc建立乙個物件);

return _instance;}-

(id)copywithzone:

(nszone *

)zone //3. copy建立乙個物件

-(id)mutablecopywithzone:

(nszone*

)zone // 4. mutablecopy建立乙個物件

mrc下,單例的**除了arc的四部分外,增加retain / release / retaincount 三部分

// 1.retain

-(instancetype)retain

// 2.release

-(oneway void

)release

// 3.retaincount

六 Qt記憶體管理

父子關係 所有指定了父物件的qt物件 繼承自qobject類的例項 與其父物件間存在父子關係 每個qt物件都儲存有指向其所有子物件的指標 每個qt物件都有乙個指向其父物件的指標 當指定 通過建構函式指定,或通過setparent函式 qt物件的父物件時 其父物件會在子物件鍊錶中加入指向該物件的指標 ...

記憶體管理筆記六 非固定分割槽的記憶體管理

引言 第五篇筆記,介紹了固定分割槽的記憶體管理方式。本篇筆記將介紹非固定分割槽的記憶體管理。一 非固定分割槽的記憶體管理 1.1 產生由來 對固定分割槽的改進 在第五篇筆記中,我們介紹了固定分割槽的缺點,包括程式大小和分割槽大小匹配不令人滿意 無法解決程式長度大於分割槽問題 位址空間劃分以後無法增長...

記憶體管理 記憶體管理概述

儲存器的發展方向是高速 大容量和小體積,即儲存器嘗試更高讀寫速度,更大儲存容量,更小物理體積。在計算機中,常見的儲存器有 暫存器,快取,記憶體,硬碟,一般硬碟之類的輔助儲存器又稱外存。在平均讀寫速度上,有 暫存器 快取 記憶體 外存 在單位容量 上,有 外存 記憶體 快取 暫存器 cpu處理器只能直...