2011-02-24 37 views
0

下面是代碼出乎意料非零指針在Objective-C代碼

Thing *thingA = [[Thing alloc] init]; 

thingA.name = @"paper"; 

Thing *things[0]; 
things[0] = thingA; 

NSLog(@"%@", things[0].name); 
// output paper 

[thingA release]; 
// here dealloc on Thing class is call 

NSLog(@"%@", things[0].name); 
// output paper yet 
- Here I thought that this object would be nill 

爲什麼元件東西[0]指向thingA指針不是nil,從而使應用程序崩潰?爲什麼thingA指針不是零?

+0

你爲什麼這樣做?據我所知,在'thingA'發佈之後,不能保證'things [0]'將存在,因爲'thingA'將很快被釋放。 – 2011-02-25 00:36:35

+0

[Objective-C中的C數組維護指向已經釋放對象的指針]的可能重複(http://stackoverflow.com/questions/5124715/c-array-in-objective-c-maintains-pointer-to-object-already -deallocated) – icktoofay 2013-11-14 04:43:51

回答

1

如果我沒有記錯,如果還有其他對象/變量引用該位置,Objective-C將不會釋放內存。

但是,它崩潰,因爲你的陣列仍具有記憶位置的地址,當您嘗試使用的東西ACCES [0]。名稱

希望這有助於不再是可供參考,因此崩潰。

+0

當其retainCount命中爲零時釋放一個對象。 – 2011-02-25 00:35:16

+0

沒錯,但是如果我記得有權避免內存釋放,就必須手動增加這個數量。 – 2011-02-25 00:42:13

+0

+ 1經典的「陳舊指針」。 – 2011-02-25 00:43:27

1

你認爲thingA的內存在執行達到最終NSLog聲明時已被釋放,但不能保證操作系統在該點上將其標記爲無效。由於您放置在該地址的值仍然存在,並且thingA仍然是指向該值的指針,所以NSLog語句仍然有效。

如果引用的內存被取消分配,操作系統不會自動將局部變量設置爲nil。這是指針變量可能很危險的原因之一。如果你願意,你可以在發送release消息後自己編程設置這些變量爲nil,特別是如果有可能再次在同一塊代碼中使用它們。