天天看點

Objective-C - retain release autorelease

Objective-C在管理記憶體時,遵循一套簡單的規則。

每一個對象都有一個名為"retainCount"的變量,它表示該對象有多少個引用。

[java]  view plain copy

  1. class *obj = [class alloc];//alloc會導緻retainCount為1  
  2. [obj retain];//retainCount++ 通常在對象指派之後這樣做,代表它多了一個引用。  
  3. [obj release];//retainCount-- 通常在使用完該對象的時候這樣做。  

當 retainCount為0時,運作時環境會通過調用[obj dealloc]來釋放對象占用的記憶體。

下面 看一個例子:

[java]  view plain copy

  1. Test *t1 = [[Test alloc] initWithNum:12];//建立了一個對象,t1是該對象的引用,由于調用了alloc此時retainCount為1  
  2. Test *t2 = t1;//此時t2也要使用該對象  
  3. [t2 retain];//t2要使用對象 就必須要retain,此時retainCount為2  
  4. [t1 release];//t1這時不用該對象了 就release了,也就是放棄了對象的使用權,此時retainCount為1  
  5. [t2 release];//t2使用完了 就release 此時retainCount為0,立刻會調用dealloc來釋放記憶體  

其實,規則很簡單。誰使用誰就先retain,用完在release就可以了。這樣就不會記憶體洩露了。

oc中存在一個autorelease pool,其實它是一個NSMutableArray。

把對象加入到autorelease pool:

[java]  view plain copy

  1. [obj autorelease];  

autorelease在釋放的時候會給所有的對象發送release,如果該對象的retainCount為1,那麼結果導緻 retainCount為0,然後運作時就會調用對象的dealloc,以此來實作記憶體釋放。

如果你

[obj retain];

之後沒有

[obj release];

在autorelease pool 釋放的時候一樣會記憶體洩露!記住autorelease pool隻是給對象發送一次release而已!

繼續閱讀