OC學習那些事:記憶體管理

來源:互聯網
上載者:User

1.範圍 

任何繼承了NSObject的對象,對基礎資料型別 (Elementary Data Type)無效。 

2.原理 

每個對象內部都儲存了一個與之相關聯的整數,稱為引用計數器。 

當使用alloc、new或者copy建立一個對象的時,對象的引用計數器設定為1。 

給對象發送一條retain訊息,可以使引用計數器+1。 

給對象發送一條release訊息,可以使引用計數器-1。 

當一個對象的引用計數器值為0時,那麼它將被銷毀,其佔用的記憶體被系統收回。OC也會自動發送一條dealloc訊息,一般會重寫dealloc方法,在這裡做釋放相關的資源。一定不要直接調用dealloc方法。 

可以給對象發送retainCount訊息擷取當前的引用計數器值。 

3.原則 

誰建立,誰釋放(”誰汙染、誰治理“)。如果你通過alloc、new或(mutable)copy來建立一個對象,那麼你必須調用release和autorelease。換句話說,不是你建立的,就不用你去釋放。 

一般來說除了alloc、new或copy之外的方法建立的對象,都聲明了autorelease。 

誰retain,誰release。只要你調用了retain,無論這個對象是如何產生的,你都要調用release。 

4.注釋 

#pragma mark -分組 #pragma mark 方法注釋  #pragma mark - 公用方法 #pragma mark 讀書 -(void)readBook {     NSLog(@"當前讀的書是:%f",_book.prize); } 

5.set方法的記憶體管理 

1.普通類型:只需要@property int age; 

2.OC類型:需要@property Book*book,聲明屬性,實現set方法(先判斷是否相等,release舊的,retain新的),在dealloc:方法中release; 

-(void)setBook:(Book *)book {     if (_book != book) {         //先釋放舊的成員變數         [_book release];         //在retain新傳進來的對象         _book = [book retain];     } }  #pragma mark 回收對象 - (void)dealloc {     [_book release];     NSLog(@"student:%i 被銷毀了",_age);     [super dealloc]; } 

6.null 指標和野指標 

null 指標:不報錯 

[nil release]; 

 

野指標:訪問了不屬於你的記憶體,會報錯。 

[stu release]; 

//野指標 

[stu release]; 

7.@property參數 

1.讀寫屬性: 

readwrite(預設) 

readonly:只產生get方法聲明 

2.setter處理: 

assign(預設) 

retain:在setter方法中,release舊值,retain新值 

copy:在setter方法,release舊值,copy新值 

3.原子性: 

atomicity(預設) 

atomicity:給方法進行枷鎖,保證多安全執行緒 

4.getter/setter方法: 

getter=isRich/setter=rich 

getter:指定getter方法的方法名 

8.自動釋放池(autorelease pool) 

自動釋放池也是OC裡面一種記憶體自動回收機制,一般可以將一些臨時變數添加到自動釋放池中,統一回收釋放。 

當自動釋放被銷毀的時候,池裡的所有對象,都會調用一次release方法。 

@autoreleasepool{}:手動建立一個自動釋放池。  @autoreleasepool {         Student *stu = [[Student alloc]init];         [stu release];     }  //iOS5.0前 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; … … [pool release]; 

9.autorelease 

OC對象只需要發送一條autorelease訊息,就會把這個對象添加到最近的自動釋放池中(棧頂的釋放池)。 

autorelease實際上只是把release調用延遲了,對於每一次autolease,系統只是把該對象放入了當前的autorelease pool中,當該pool被釋放時,該pool中的所有對象都會調用release方法。 

10.autorelease pool注意 

在ARC下,不能使用[[NSAutoreleasePool alloc]init]建立自動釋放池,應當使用@autoreleasepool。 

不要把大量的迴圈操作放到同一個NSAutoreleasePool 之間,這樣會造成記憶體峰值上升。 

盡量避免對大記憶體使用量該方法,對於這種延遲釋放機制,還是盡量少用。 

sdk一般利用靜態方法建立並返回對象都是已經autorelease的,不需要再進行release操作。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.