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...