#define TT_RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; }
爲什麼three20認爲可以安全地將ivar在發佈後歸零?忽略ivar = nil
步驟是不安全的嗎?爲什麼在iPhone中使用three20中的TT_RELEASE_SAFELY?
我不認爲我使用KVO/KVC,但我真的不知道。我現在正在閱讀。
謝謝!
馬特
#define TT_RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; }
爲什麼three20認爲可以安全地將ivar在發佈後歸零?忽略ivar = nil
步驟是不安全的嗎?爲什麼在iPhone中使用three20中的TT_RELEASE_SAFELY?
我不認爲我使用KVO/KVC,但我真的不知道。我現在正在閱讀。
謝謝!
馬特
當在-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
只是一個編譯時錯誤。
特別是對於高德釋放的情況下,在dealloc
有爭論的關於是否是更好的釋放與否之後將它們設置爲nil
社會公平的金額。
一般來說,零難民營會讓應用程序在解除分配後訪問對象的不幸情況下,甚至在多線程應用程序期間崩潰。
反零營不認爲上述參數是特別有用的,因爲他們覺得應用程序應該在這種情況下崩潰,使它更明顯,你的應用程序有缺陷(它正在訪問一個釋放目的)。
這並不一定是最全面的立場總結,但它給你一個涉及「爭議」的想法。
KVO/KVC問題有些分離,因爲這不是關於是否將ivar設置爲零,而是因爲可能的副作用問題使用屬性的setter來安全使用(如KVO/KVC)。
謝謝。這就說得通了。你對Yuji的第三種選擇有什麼看法? – ma11hew28 2010-09-25 13:02:53
我喜歡第三個選項。我不知道你可以這樣做。但是,我從來沒有見過。如果這是做到這一點的最佳方式,那我爲什麼不看它。我應該開始這樣做嗎?它是否使代碼混亂? – ma11hew28 2010-09-25 13:01:04
我閱讀了您鏈接到的博客條目。他們給出的宏選項似乎是一個很好的解決方案。 – ma11hew28 2010-09-25 13:54:24
是的,在方法中確定變量的範圍可能是一個好主意,我也是這樣做的。我傾向於懶惰,雖然因爲我還沒有被這個咬過。 – imaginaryboy 2010-09-25 16:50:25