Objective-C在管理記憶體時,遵循一套簡單的規則。
每一個對象都有一個名為"retainCount"的變量,它表示該對象有多少個引用。
[java] view plain copy
- class *obj = [class alloc];//alloc會導緻retainCount為1
- [obj retain];//retainCount++ 通常在對象指派之後這樣做,代表它多了一個引用。
- [obj release];//retainCount-- 通常在使用完該對象的時候這樣做。
當 retainCount為0時,運作時環境會通過調用[obj dealloc]來釋放對象占用的記憶體。
下面 看一個例子:
[java] view plain copy
- Test *t1 = [[Test alloc] initWithNum:12];//建立了一個對象,t1是該對象的引用,由于調用了alloc此時retainCount為1
- Test *t2 = t1;//此時t2也要使用該對象
- [t2 retain];//t2要使用對象 就必須要retain,此時retainCount為2
- [t1 release];//t1這時不用該對象了 就release了,也就是放棄了對象的使用權,此時retainCount為1
- [t2 release];//t2使用完了 就release 此時retainCount為0,立刻會調用dealloc來釋放記憶體
其實,規則很簡單。誰使用誰就先retain,用完在release就可以了。這樣就不會記憶體洩露了。
oc中存在一個autorelease pool,其實它是一個NSMutableArray。
把對象加入到autorelease pool:
[java] view plain copy
- [obj autorelease];
autorelease在釋放的時候會給所有的對象發送release,如果該對象的retainCount為1,那麼結果導緻 retainCount為0,然後運作時就會調用對象的dealloc,以此來實作記憶體釋放。
如果你
[obj retain];
之後沒有
[obj release];
在autorelease pool 釋放的時候一樣會記憶體洩露!記住autorelease pool隻是給對象發送一次release而已!