2010-07-25 28 views
1

我是Objective-C的新手,我無法理解這一點。我知道我可以發送一條消息給零(它對Objective-C的特性大肆宣傳),但我不能發送消息給發佈的對象,在這種情況下得到一個異常,它們之間的區別是什麼?零與釋放對象之間的區別

回答

3

nil是內存地址0運行時知道什麼時候這個地址傳遞消息不做任何事情,因爲它是預定不存在的對象地址。

然而,解分配的對象將隨機內存地址,因爲指針沒有清理時,以前有效的對象被銷燬。由於它不是規定的不敏感對象地址,因此運行時不知道它是無效的,並且會嘗試將消息發送給它。這通常會使程序立即崩潰。

您可以通過一旦你釋放了他們設置變量nil避免這種情況。

+0

@您可以通過將變量設置爲零來避免這種情況,一旦您釋放它們。 謝謝,我不知道。但是如果一個變量保留count == 2會發生什麼情況,並且釋放後它不會被釋放,如果我將它設置爲零,但它有其他所有者,我不會很好,對不對? – Burjua 2010-07-25 16:14:08

+0

@Aristarh:只要你釋放一個對象,你應該認爲它已經死了。不要擔心其他參考。對象的其他所有者負責在完成它後釋放它。因此,將'nil'設置爲已被釋放的對象的引用是「本地安全的」。 – zneak 2010-07-25 16:44:01

+0

好的,非常感謝您的解答,+1))) – Burjua 2010-07-25 16:49:25

0

nil是'指向沒有',它允許發送消息到零(無)。 一個對象有一個數據抵抗的地址。您使用此地址發送消息並釋放該對象。就像這樣:

id myObject; // Initialized some where else 
[myObject release]; 

,然後將其發送類似這樣的消息:

[myObject someMessage]; // At this point myObject != nil. Not allowed 

那麼你實際上是試圖將消息發送到現在釋放的對象的地址。這是不允許的。

myObject = nil; 
[myObject someMessage]; // Allowed 
相關問題