2011-08-18 32 views
1

通過代碼蘋果尋找生成的核心數據,我發現這段代碼這只是聰明的[__persistentStoreCoordinator發佈],__persistentStoreCoordinator =零;

[__persistentStoreCoordinator release], __persistentStoreCoordinator = nil; 

我理解的目的,它不過是有寫這樣的代碼,而不是僅僅像這樣

[__persistentStoreCoordinator release]; 
__persistentStoreCoordinator = nil; 
任何目的

還是僅僅是聰明?

+0

在這種情況下,逗號運算符是純粹的文體選擇。這是[類似的問題](http://stackoverflow.com/questions/2585773/in-objective-c-what-does-a-comma-do-when-used-as-a-statement-separator)。 – albertamg

回答

1

它純粹是一種文體選擇,但表達意圖。在這種情況下,它表達的意圖是釋放和零任務是一個單一的「操作」,應該保持在一起。作爲兩條獨立的行,您可以自由地在它們之間插入行,但作爲使用逗號運算符的單個語句,需要更多的工作來分割它們。

這對讀者也是有幫助的,因爲他們不必分析兩條不同的線,弄清楚他們在做什麼,並且明白它只是試圖清除那個伊娃。相反,作爲一種說法,讀者可以快速識別這種模式(一旦他們已經看過幾次),並且它對用戶產生較小的認知負荷。例如,這裏有一個-dealloc使用單獨的語句

- (void)dealloc { 
    [_foo release]; 
    _foo = nil; 
    [_bar release]; 
    _bar = nil; 
    [_blah release]; 
    _blah = nil; 
    [_baz release]; 
    _baz = nil; 
    [super dealloc]; 
} 

下面是等價的:

- (void)dealloc { 
    [_foo release], _foo = nil; 
    [_bar release], _bar = nil; 
    [_blah release], _blah = nil; 
    [_baz release], _baz = nil; 
    [super dealloc]; 
} 

不僅是這個代碼行數更少,但圖案是立即明顯給讀者。它看起來更美觀,每一行都是一個方法調用,然後是一個零賦值。

+0

我想它也會使複製和粘貼更容易,也許我會採用這種風格。 –

+0

我個人在任何地方都使用它,無論我釋放和閹割一個ivar(通常在'-dealloc'中,因爲我傾向於在其他地方使用屬性),而在其他任何地方都無法使用它。 –

3

它們是等價的,所以是的,它們只是「聰明」。

+0

如果「聰明」意味着「難以掃描」。 – TechZen

0

我認爲C語言的技術定義表明,不允許編譯器像表達式那樣完全像語句一樣優化表達式。通過使用','而不是';',作者認爲他已經將這兩個操作寫成一個單獨的原子動作。

我懷疑他們是否有所作爲,但他們至少傳達了一個意圖。一旦指針被釋放,它就是零。