天天看點

關于Objective-C 對象release操作的一個小問題探讨

 最近遇到這樣一個問題,以前的時候并未注意;建立一個工程,然後添加一個類,檔案結構是這樣的

然後寫了這樣一小段程式,運作

- (void)viewDidLoad   

{   

    [super viewDidLoad];   

    Test *testObj = [[Test alloc] init];   

    NSLog(@"release 前 %d",[testObj retainCount]);   

    [testObj release];   

    NSLog(@"release 後 %d",[testObj retainCount]);   

}   

<a href="http://blog.51cto.com/attachment/201304/200255503.png" target="_blank"></a>

明明release了,retainCount計數應該為0,但是 為什麼retainCount計數還是1,當我們release操作兩次的時候程式就崩潰了;

然後我們列印一下testObj對象

[cpp] view plaincopy 

    NSLog(@"testObj  release指向--&gt;%@",testObj);   

<a href="http://blog.51cto.com/attachment/201304/200325277.png" target="_blank"></a>

發現他們指向同一塊位址;

testObj 在alloc的時候在堆上申請到一片空間,然後它的retainCount計數為1,然後我們release之後,testObj指向的空間被銷毀了,不存在了。此時testObj就是一個野指針了;此時我們調用[testObj retainCount]就屬于一個不安全的做法;

然後我們在添加一行代碼,[testObj release]之後,添加 testObj = nil;

    testObj = nil;   

<a href="http://blog.51cto.com/attachment/201304/200349289.png" target="_blank"></a>

唉,看到這裡就應該明白了吧,[testObj release] 後,testObj仍有指向,隻是testObj原來指向的那片空間已被銷毀,但是本身還存在,通過置為nil這一步操作,就不在指向原來那片位址;應該記起viewDidUnload函數作用了吧,它就是幹這個活的,我們申明一個對象屬性的時候,在viewDidUnload中将這個屬性置為nil這一步操作;

     本文轉自新風作浪 51CTO部落格,原文連結:http://blog.51cto.com/duxinfeng/1170381,如需轉載請自行聯系原作者