1.UIViewController的retainCount在某些情況下表現(xiàn)的和我們看到的不太一樣;例如下面的代碼:
2.UIView * mainView = xxx;
3.UIViewController * subVC = [[UIViewController alloc] init];//這里subVC的retainCount=1
4.[mainView addSubview:subVC.view];//這里subVC的retainCount =3,增加了2
Then later,
5.[subVC.view removeFromSuperview]; //這里subVC的retainCount為4;增加了1
6.[subVC release];//這里subVC引用計(jì)數(shù)為3,減少了1
實(shí)際上我們期待在6的時(shí)候subVC的引用計(jì)數(shù)為0,并且dealloc被調(diào)用,但實(shí)際上沒有。那么為什么呢?
為了驗(yàn)證這個(gè)問題,我們將這個(gè)指針在指針在6之后保存下來(lái):
UIViewController * temp = subVC;
作為一個(gè)全局變量。
等一段時(shí)間后,調(diào)用 temp.retainCount,這個(gè)時(shí)候代碼會(huì)crash,這說(shuō)明什么?
說(shuō)明temp已經(jīng)是無(wú)效的指針了。
到此可以證明UIViewController在做removeFromSuperView的時(shí)候是delay,并且做了一次autorelease(不知道出于說(shuō)明目的,或許是為了防止動(dòng)畫),等所有動(dòng)作完成,其將所有的retainCount減為0.
因此,上面的這種寫法雖然最后retainCount不為0,但代碼沒有錯(cuò),也沒有內(nèi)存泄露。因此只要保證進(jìn)行了和分配添加相反地操作,內(nèi)存就應(yīng)該被釋放的。