您好,登錄后才能下訂單哦!
最近遇到這樣一個問題,以前的時候并未注意;新建一個工程,然后添加一個類,文件結構是這樣的
然后寫了這樣一小段程序,運行
- (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這一步操作;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。