回答

6

當在-dealloc裏面時,這個問題會分裂Objective-C專家。例如閱讀最近的blog entry

當在其他方法的實現中,我個人的觀點是你首先應該在發佈之後不要將變量保留在範圍內。此代碼

SomeClass* someObject= ... 
    ... use someObject ... 
    [someObject release]; 
    ... more code ... 

可能在代碼中意外地訪問someObject,從而導致崩潰。所以,你可能會說

SomeClass* someObject= ... 
    ... use someObject ... 
    [someObject release]; 
    someObject=nil; 
    ... more code ... 

會更好,因爲消息來nil是無害的。 然而,在這種情況下,你可以完全消除危險:

{ 
     SomeClass* someObject= ... 
     ... use someObject ... 
    [someObject release]; 
    } 
    ... more code ... 

這裏我使用的是{...}塊來限制變量的作用域。那麼以後使用someObject只是一個編譯時錯誤。

+0

我喜歡第三個選項。我不知道你可以這樣做。但是,我從來沒有見過。如果這是做到這一點的最佳方式,那我爲什麼不看它。我應該開始這樣做嗎?它是否使代碼混亂? – ma11hew28 2010-09-25 13:01:04

+0

我閱讀了您鏈接到的博客條目。他們給出的宏選項似乎是一個很好的解決方案。 – ma11hew28 2010-09-25 13:54:24

+0

是的,在方法中確定變量的範圍可能是一個好主意,我也是這樣做的。我傾向於懶惰,雖然因爲我還沒有被這個咬過。 – imaginaryboy 2010-09-25 16:50:25

3

特別是對於高德釋放的情況下,在dealloc有爭論的關於是否是更好的釋放與否之後將它們設置爲nil社會公平的金額。

一般來說,零難民營會讓應用程序在解除分配後訪問對象的不幸情況下,甚至在多線程應用程序期間崩潰。

反零營不認爲上述參數是特別有用的,因爲他們覺得應用程序應該在這種情況下崩潰,使它更明顯,你的應用程序有缺陷(它正在訪問一個釋放目的)。

這並不一定是最全面的立場總結,但它給你一個涉及「爭議」的想法。

KVO/KVC問題有些分離,因爲這不是關於是否將ivar設置爲零,而是因爲可能的副作用問題使用屬性的setter來安全使用(如KVO/KVC)。

+0

謝謝。這就說得通了。你對Yuji的第三種選擇有什麼看法? – ma11hew28 2010-09-25 13:02:53

相關問題