Manual Reference Counting(簡寫MRC)多線程
調回手動內存管理要有下面的操做性能
引用計數器的基本操做
atom
1.方法的基本使用
1> retain :計數器+1,會返回對象自己
2> release :計數器-1,沒有返回值
3> retainCount :獲取當前的計數器
4> dealloc
* 當一個對象要被回收的時候,就會調用
* 必定要調用[super dealloc],這句調用要放在最後面
2.概念
1> 殭屍對象 :所佔用內存已經被回收的對象,殭屍對象不能再使用
2> 野指針 :指向殭屍對象(不可用內存)的指針,給野指針發送消息會報錯(EXC_BAD_ACCESS)
3> 空指針 :沒有指向任何東西的指針(存儲的東西是nil、NULL、0),給空指針發送消息不會報錯
spa
多對象的內存管理.net
1.你想使用(佔用)某個對象,就應該讓對象的計數器+1(讓對象作一次retain操做)
2.你不想再使用(佔用)某個對象,就應該讓對象的計數器-1(讓對象作一次release)
3.誰retain,誰release
4.誰alloc,誰release
線程
set方法的內存管理指針
內存管理代碼規範:
1.只要調用了alloc,必須有release(autorelease)
對象不是經過alloc產生的,就不須要release
2.set方法的代碼規範
1> 基本數據類型:直接複製
- (void)setAge:(int)age
{
_age = age;
}
2> OC對象類型
- (void)setCar:(Car *)car
{
// 1.先判斷是否是新傳進來對象
if ( car != _car )
{
// 2.對舊對象作一次release
[_car release];
// 3.對新對象作一次retain
_car = [car retain];
}
}
3.dealloc方法的代碼規範
1> 必定要[super dealloc],並且放到最後面
2> 對self(當前)所擁有的其餘對象作一次release
- (void)dealloc
{
[_car release];
[super dealloc];
}
代碼規範
@property參數對象
1.set方法內存管理相關的參數
* retain : release舊值,retain新值(適用於OC對象類型)
* assign : 直接賦值(默認,適用於非OC對象類型)
* copy : release舊值,copy新值
2.是否要生成set方法
* readwrite : 同時生成setter和getter的聲明、實現(默認)
* readonly : 只會生成getter的聲明、實現
3.多線程管理
* nonatomic : 性能高 (通常就用這個)
* atomic : 性能低(默認)
4.setter和getter方法的名稱
* setter : 決定了set方法的名稱,必定要有個冒號 :
* getter : 決定了get方法的名稱(通常用在BOOL類型)
內存
循環引用及@class
1.@class 的做用:僅僅告訴編譯器,某個名稱是一個類
@class Person; // 僅僅告訴編譯器,Person是一個類
2.開發中引用一個類的規範
1> 在.h文件中用@class 來聲明類
2> 在.m文件中用#import來包含類的全部東西
3.兩端循環引用解決方案
1> 一端用retain
2> 一端用assign
autorelease
1.autorelease的基本用法
1> 會將對象放到一個自動釋放池中
2> 當自動釋放池被銷燬時,會對池子裏面的全部對象作一次release操做
3> 會返回對象自己
4> 調用完autorelease方法後,對象的計數器不變
2.autorelease的好處
1> 不用再關心對象釋放的時間
2> 不用再關心何時調用release
3.autorelease的使用注意
1> 佔用內存較大的對象不要隨便使用autorelease
2> 佔用內存較小的對象使用autorelease,沒有太大影響
6.自動釋放池的建立方式
1> iOS 5.0前
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pool release]; // [pool drain];
2> iOS 5.0 開始
@autoreleasepool
{
}
1.官方內存管理原則
1> 當調用alloc、new、copy(mutableCopy)方法產生一個新對象的時候,就必須在最後調用一次release或者autorelease
2> 當調用retain方法讓對象的計數器+1,就必須在最後調用一次release或者autorelease
2.集合的內存管理細節
1> 當把一個對象添加到集合中時,這個對象會作了一次retain操做,計數器會+1
2> 當一個集合被銷燬時,會對集合裏面的全部對象作一次release操做,計數器會-1
3> 當一個對象從集合中移除時,這個對象會一次release操做,計數器會-1
3.廣泛規律
1> 若是方法名是add\insert開頭,那麼被添加的對象,計數器會+1
2> 若是方法名是remove\delete開頭,那麼被移除的對象,計數器-1