----------- android教育訓練、java教育訓練、ios學習型技術部落格、期待與您交流! ------------
OC--記憶體管理
1.凡是從NSObject中繼承的類都需要自己管理記憶體,在OC文法中,建立的任何一個對象都擁有一個引用計數器,第一次建立的時候這個引用計數器為1,當引用計數器的值為0時,該對象會被銷毀。記憶體管理涉及到以下接口:
* release : 對象的引用計數器減1
* retain : 對象的引用計數器加1
* retainCount : 擷取對象目前引用計數器的數量
2.對象生命周期回調接口:
* init : 對象的預設構造方法,如果自定義構造方法用于初始化成員變量時,必須先調用父類的構造方法,并判斷獲得的對象是否為nil,再初始化成員變量。
如:- (void)initWithAge:(int)age {
if ( self = [super init] ) {
_age = age;
}
return self;
}
3.dealloc : 對象銷毀時,系統會自動調用該方法,通常在該方法中釋放記憶體或其它資源。在重寫dealloc方法時,注意在代碼最後面調用父類的dealloc方法,用于釋放記憶體等相關資源。
如:
- (void)dealloc {
[_book release]; 釋放成員變量
[super dealloc];
}
4. 不需要管理記憶體的對象
* 基本資料類型
* 系統自帶的類調用自己的靜态方法建立的對象,是自動釋放記憶體的,不需要管理
5.記憶體管理原則
隻有向對象發送了alloc,retain,copy,new消息才有必要做release操作
* 誰alloc,retain,copy,new誰release
* 誰建立誰釋放(release)
* 誰沒有allock,retain,copy,new,你就不要做release操作
6.自動記憶體管理(由autoreleasepool管理)
在建立對象的同時,調用autorelease方法,會将該對象的一個引用自動存放到最近建立的一個自動釋放釋放池中。以後該對象就不需要手動來release操作,徐非做了retain,copy等修改了引用計數器的操作。當自動釋放池被銷毀時,會向池子中所有對象發送一個release消息,池子中的所有對象的引用計數器此時會減1,隻有當池子中的引用計數器為0時,該對象才會被徹底銷毀。不是說隻要将對象交給自動釋放池了,池子被銷毀,池子中的所有對象就一定會被銷毀。
如:@autoreleasepool {
Student *stu = [[[Student alloc] init]autorelease];此時stu對象将放到這個大括号中的自動釋放池子中
[stu retain];如果加了這一句,此時stu的引用計數器為2,這時候如果在池子銷毀前沒有向對象發送release消息,就算池子銷毀,該對象也還是會造成記憶體洩露
} 程式執行到此處,代表自動釋放池被銷毀,意味着池子中的所有對象都會接到一個release消息
7.ARC:自動引用計數,無需手動釋放對象,這是編譯器特性
----------- android教育訓練、java教育訓練、ios學習型技術部落格、期待與您交流! ------------
轉載于:https://www.cnblogs.com/blog-lc/p/3807271.html