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

最近遇到這樣一個問題,以前的時候並未注意;新建一個工程,然後添加一個類,文件結構是這樣的



然後寫了這樣一小段程序,運行

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    Test *testObj = [[Test alloc] init];
    NSLog(@"release 前 %d",[testObj retainCount]);
    [testObj release];
    NSLog(@"release 後 %d",[testObj retainCount]);
	
}



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


然後我們打印一下testObj對象

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    Test *testObj = [[Test alloc] init];
    NSLog(@"release 前 %d",[testObj retainCount]);

    NSLog(@"testObj  release指向-->%@",testObj);
    
    [testObj release];

    NSLog(@"release 後 %d",[testObj retainCount]);
    
    NSLog(@"testObj  release指向-->%@",testObj);
    
	
}



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

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


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

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    Test *testObj = [[Test alloc] init];
    NSLog(@"release 前 %d",[testObj retainCount]);
    NSLog(@"testObj  release指向-->%@",testObj);
    [testObj release];
    testObj = nil;
    NSLog(@"release 後 %d",[testObj retainCount]);
    NSLog(@"testObj  release指向-->%@",testObj);
    
	
}



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







發佈了124 篇原創文章 · 獲贊 572 · 訪問量 246萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章