記憶體管理(16 5 10)

2021-07-11 17:25:49 字數 4282 閱讀 7002

cocoa中的記憶體管理機制:

每乙個物件都有乙個引用計數(retain count);

物件被建立的時候,引用計數的值是1;

當引用計數值是0的時候,系統會呼叫自己的dealloc方法將物件銷毀;

retaincount 用來列印當前的引用計數/

記憶體管理原則:

記憶體管理就是最終的引用計數要平衡,如果最後引用計數大於0則會記憶體洩漏,如果引用計數等於0還對該物件進行操作,則會出現記憶體訪問失敗,程式閃退,所以應設定為nil。

ios物件都繼承於nsobject,改物件有乙個retaincount來顯示記憶體的引用計數。

物件操作:

retain、alloc、new 使用後物件的引用計數都+1;

release:釋放乙個物件後引用計數-1,如果引用計數為0則立刻釋放記憶體,銷毀物件。

autorelease:自動釋放乙個物件後引用計數-1,如果為0不立刻釋放,而是交給系統在手機記憶體不足時釋放。

引用計數舉例:

// alloc retain release

book *abook = [[book

alloc]init];// alloc

nslog(@"1.retaincount=%d", (int)[abookretaincount]);//count:1

[abook retain]; // retain

nslog(@"2.retaincount=%d", (int)[abookretaincount]);//count:2

[abook retain]; // retain

nslog(@"3.retaincount=%d", (int)[abookretaincount]);//count:3

[abook release]; // release

nslog(@"4.retaincount=%d", (int)[abookretaincount]);//count:2

[abook release]; // release

nslog(@"5.retaincount=%d", (int)[abookretaincount]);//count:1

[abook

release

];// release count:0 dealloc it

nslog

(@"6.retaincount=%d"

, (int

)[abook

retaincount

]);//count:1這是因為系統延時釋放物件所致

// 這裡abook已經釋放了,再次呼叫release就會報錯

[abook

release

];// error:pointer being freed was not allocated

// alloc copy retain release

book *abook = [[book alloc] init]; // alloc

nslog(@"1.abook retaincount=%d", (int)[abook retaincount]);//count:1

book *abook2 = [abook copy]; // 需要實現book裡的-(id)copywithzone:(nszone*)zone方法

nslog(@"2.abook retaincount=%d

--abook2 retaincount=%d", (int)[abook retaincount], (int)[abook2 retaincount]); //count:1 1

[abook retain]; // retain

[abook2 retain]; // retain

nslog(@"3.abook retaincount=%d

--abook2 retaincount=%d", (int)[abook retaincount], (int)[abook2 retaincount]); //count:2 2

[abook release]; // release

[abook2 release]; // release

nslog(@"4.abook retaincount=%d

--abook2 retaincount=%d", (int)[abook retaincount], (int)[abook2 retaincount]); //count:1 1

[abook retain]; // retain

[abook2 retain]; // retain

nslog(@"5.abook retaincount=%d

--abook2 retaincount=%d", (int)[abook retaincount], (int)[abook2 retaincount]); //count:2 2

[abook release]; // release

[abook2 release]; // release

nslog(@"6.abook retaincount=%d

--abook2 retaincount=%d", (int)[abook retaincount], (int)[abook2 retaincount]); //count:1 1

[abook release]; // release

[abook2 release]; // release

nslog(@"7.abook retaincount=%d

--abook2 retaincount=%d", (int)[abook retaincount], (int)[abook2 retaincount]); //count:0 0

// 再次呼叫 release就報錯

[abook release]; // error:pointer being freed was not allocated

[abook2 release]; // error:pointer being freed was not allocated

// new release

book *abook = [book new]; //

等效於[[book alloc] init]

nslog(@"1.abook retaincount=%d", (int)[abook retaincount]);//count:1

[abook release];

nslog(@"2.abook retaincount=%d", (int)[abook retaincount]);//count:0

//再呼叫就報錯了

[abook release]; // error:pointer being freed was not allocated

呼叫到的方法:

引用計數為0的時候呼叫系統的方法:

- (void)dealloc

copy複製時呼叫:

- (id)copywithzone:(nszone*)zone

記憶體管理總結:

誰建立,誰釋放。如果你通過alloc、new或copy來建立乙個物件,那麼你必須呼叫release或autorelease。

retain乙個物件,就要呼叫呼叫release或autorelease,retain與release保持一致。

release乙個物件後,立即把指標晴空。[obj release] obj = nil;

指標賦值給另乙個指標記得retain。classa *obj2 = obj1; [obj2 retain];

在乙個函式中建立並返回物件,需要把這個物件設定成autorelease,而不能設定為release。

在研究retain count的時候,我不建議用nsstring。因為在下面的語句中,

nsstring *str1 = @」constant string」;str1的retain count是個很大的數字。objective-c對常

量字串做了特殊處理。當然,如果你這樣建立nsstring,得到的retain count

依然為1

nsstring *str2 = [nsstring

stringwithformat:@」123」]; 

除了alloc、new、retain或copy之外的方法建立的物件都自動被宣告了autorelease,不用再去釋放。

從xcode6.0開始,系統預設使用 arc機制(即自動釋放記憶體機制),之前的都是 mrc(手動釋放記憶體機制)

在targets - bubild settings ,輸出objc 。 可以讓工程使用arc或mrc。

注:記憶體管理這一塊非常的重要,在筆試面試都會考的到!!!!

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

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

《記憶體管理》 記憶體

1.c c 記憶體分布 我們先來看下面的一段 和相關問題 int globalvar 1 static int staticglobalvar 1 void test char char2 abcd char pchar3 abcd int ptr1 int malloc sizeof int 4 ...

關於mysql記憶體管理 MYSQL記憶體管理及優化

mysql記憶體管理及優化 記憶體是影響資料庫效能的主要資源,也是mysql效能優化的乙個重要方面 記憶體優化的原則 將盡量多的記憶體分配給mysql做快取,但是要給作業系統和其他程式的執行預留足夠的記憶體,否則產生swap頁交換,將嚴重影響系統效能 myisam的資料檔案讀取以來作業系統自身的io...