IOS階段學習第20天筆記(OC中的記憶體管理),iosoc
IOS學習(OC語言)知識點整理
一、OC中的記憶體管理
1)概念:記憶體管理的對象為所有繼承了NSObject的對象,對基本資料(如:int 、float、double...)無效
OC中採用引用計數器對記憶體做管理,他是一個整數資料,表示對象引用的次數,每個對象分配4位元組
的記憶體空間存放引用計數器。當一個對象的引用計數器為0時 它將被自動釋放,反過來說 當使用alloc、
new 、copy(mutableCopy)建立新對象時,引用計數器預設為1
2)黃金法則 當使用alloc、new 、copy(mutableCopy)建立一個對象賦值給某個引用時後當不再使用這
個引用時一定要發送release(autoRelease)訊息 釋放該對象所佔用的記憶體。
3)這裡所講的記憶體管理為手動記憶體管理,建立項目是系統預設是自動記憶體管理的,所以需要手動設定,即在項目
的Build Settings 中找到 Objective-C Automatic Reference Counting 項設定為NO; 同時需要添加對野指
針的監控 即在Edit Scheme 中找到並勾選 Enable Zoombie Objects 項。
3)記憶體管理操作 執行個體代碼:
1、添加一個Person類 .h檔案中不做任何操作
2、在.m 檔案中析構系統銷毀記憶體執行方法 例如:
1 #import "Person.h"2 @implementation Person3 //析構系統銷毀記憶體執行方法4 -(void)dealloc{5 NSLog(@"Person dealloc");6 }7 @end
3、在main檔案中執行操作 例如:
Person *p1=[[Person alloc]init];//引用計數器預設+1[p1 retain]; //引用計數器+1NSLog(@"retainCount:%ld",p1.retainCount);//結果:2[p1 release];//引用計數器-1//retainCount 擷取引用計數器的個數NSLog(@"retainCount:%ld",p1.retainCount);//結果:1[p1 release];NSLog(@"retainCount:%ld",p1.retainCount);//結果:0
4)在使用組合類別是銷毀自身對象時需要先銷毀組合的對象 ,即在析構方法中銷毀組合對象 例如:
1 //Person 類中有一個Book 類 在Person類的.m檔案中添加此方法2 -(void)dealloc{3 [_book release];4 NSLog(@"Person dealloc");5 }
5)組合類別初始化時需要在父類中添加set方法用於在給組合類別賦值時增加引用計數器個數 例如:
1 //Person 類中Book類的賦值方法2 -(void)setBook:(Book*)book{3 book=[book retain];4 }5 6 //Person 類中Book類的取值方法7 -(Book*)book{8 return _book;9 }
6)數組中的記憶體管理:銷毀數組對象時需要先銷毀數組中存放的對象 例如:
1 NSMutableArray *array=[[NSMutableArray alloc]init]; 2 NSLog(@"%ld",array.retainCount); 3 for (int i=0; i<5; i++) { 4 Book *b=[[Book alloc]init]; 5 b.ID=i+1; 6 [array addObject:b]; 7 } 8 NSLog(@"before array %ld",array.retainCount);//結果:1 9 for (int i=0; i<array.count; i++) {10 [array[i] release];11 }12 [array release];13 NSLog(@"after array %ld",array.retainCount);//結果:0
7)循環參考的記憶體管理:針對循環參考時我們必須將其中一個物件類型由retain 改為assign 類型
否則將無法徹底釋放記憶體。
8)autorelease 自動釋放池 :將對象放入一個自動釋放池中,當自動釋放池被銷毀時,會給池子中
所有的對象發送 release訊息autorelease 方法返回對象本身給對象發送autorelease 訊息後引用
計數器值不變