IOS階段學習第20天筆記(OC中的記憶體管理),iosoc

來源:互聯網
上載者:User

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 訊息後引用
      計數器值不變

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.