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操作。