標籤:style blog http color io os ar 使用 strong
引用計數器
當一個對象被建立出來,就要分配給記憶體這個對象,當不用這個對象的時候,就要及時的回收,為了可以明確知道對象有沒有被使用,就要用引用計數器來體現,只要計數器不為0,表明對象被使用中。
1.方法的基本使用
1> retain :計數器+1,會返回對象本身
2> release :計數器-1,沒有傳回值
3> retainCount :擷取當前的計數器
4> dealloc
* 當一個對象要被回收的時候,就會調用
* 一定要調用[super dealloc],這句調用要放在最後面
2.概念
1> 殭屍對象 :所佔用記憶體已經被回收的對象,殭屍對象不能再使用
2> 野指標 :指向殭屍對象(不可用記憶體)的指標,給野指標發送訊息會報錯(EXC_BAD_ACCESS)
3> null 指標 :沒有指向任何東西的指標(儲存的東西是nil、NULL、0),給null 指標發送訊息不會報錯
常見錯誤:
EXC_BAD_ACCESS : 訪問了一塊壞的記憶體(已經被回收、已經停用記憶體
-[Person setAge:]: message sent to deallocated instance 0x100109a10
給已經釋放的對象發送了一條-setAge:訊息
set方法記憶體管理
如果一個指標指向一個新建立出來的對象,對象的計數器會加1,當指標又指向了一個新的對象的時候,原來的對象佔用的記憶體就應該要及時的釋放,這個時候就需要對set方法重寫,對對象的計數器做一次管理
- (void)setCar:(Car *)car{ if (car != _car) { // 對當前正在使用的車(舊車)做一次release [_car release]; // 對新車做一次retain操作 _car = [car retain]; }}
說明:基礎資料型別 (Elementary Data Type)不需要管理記憶體
在對象被回收的時候會自動調用dealloc方法
- (void)dealloc { [_car release]; [super dealloc]; }
記憶體管理代碼規範:
只要調用了alloc,copy,必須有release(autorelease)
對象不是通過alloc或者copy產生的,就不需要release
autorelease和autoreleasePool
1.autorelease的基本用法
1> 會將對象放到一個自動釋放池中
2> 當自動釋放池被銷毀時,會對池子裡面的所有對象做一次release操作
3> 會返回對象本身
4> 調用完autorelease方法後,對象的計數器不變
2.autorelease的好處
1> 不用再關心對象釋放的時間
2> 不用再關心什麼時候調用release
3.autorelease的使用注意
1> 佔用記憶體較大的對象不要隨便使用autorelease
2> 佔用記憶體較小的對象使用autorelease,沒有太大影響
4.錯誤寫法
1> alloc之後調用了autorelease,又調用release
@autoreleasepool { // 1 Person *p = [[[Person alloc] init] autorelease]; // 0 [p release]; }
2> 連續調用多次autorelease
@autoreleasepool { Person *p = [[[[Person alloc] init] autorelease] autorelease]; }
5.自動釋放池
1> 在iOS程式運行過程中,會建立無數個池子。這些池子都是以棧結構存在(先進後出)
2> 當一個對象調用autorelease方法時,會將這個對象放到棧頂的釋放池
說明:
1.autorelease方法會返回對象本身
2.調用完autorelease方法後,對象的計數器不變
3.autorelease會將對象放到一個自動釋放池中
4.當自動釋放池被銷毀時,會對池子裡面的所有對象做一次release操作
黑馬程式員_ Objective-c 記憶體管理筆記