2011-07-05 51 views
0

我一直在閱讀「Beginning iPhone 4 Development」一書,他們有一本關於使用導航控制器的教程。在本教程中,我們將視圖控制器(名爲childController)推到視圖上。但是因爲我們不想爲其他類「公開」這個控制器,我們還沒有爲它創建任何訪問器方法。所以在viewDidUnload的作者寫:iOS - viewDidUnload奇怪的呼叫

- (void)viewDidUnload { 
    [childController release], childController = nil; 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 

我真的不明白髮布後的逗號標誌?這段代碼實際上是爲我工作的。我沒有收到任何錯誤或內存泄漏。

但我的理解它不應該是這樣的,而不是:

- (void)viewDidUnload { 
    [childController release]; 
    childController = nil; 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 

回答

3
[childController release], childController = nil; 

這是純C,comma operator瞄準 「排序」 表達式。實際上,在這種情況下,它是完全等價於:

[childController release]; 
childController = nil; 

改變是可讀性的唯一的事情(爲更好或者更差,這取決於...)

但在一般的順序運算符計算爲最後一個語句的值(即所有操作數的值都被丟棄,除了最後一個)。

int a, b; 
int c = (a = 1), (b = 2); 

執行此語句後c將爲2。

編輯:從我加入了鏈接:

幾乎沒有存在的理由使用逗號操作符的任何地方比在for循環的第一個和第三個控制表達式等,而事實上大部分的逗號你在C程序中看到的不是逗號運算符。特別是,函數調用中參數之間的逗號不是逗號操作符;它們只是分隔幾個參數表達式的標點符號。這是很容易看到,他們不能用逗號運營商,否則像

編輯的電話:一個更好的例子:

int a = 1; 
int b = 2; 
b = printf("%d, %d", a,b), a+b; 

首先會打印:

1, 2 

然後分配3至b。

+0

謝謝!但是我的建議等同於上面的解決方案呢? –

+0

增加了更多信息。簡短的回答:是的。 – sergio

+0

@Peter請注意,逗號運算符不能應用於語句。它的操作數必須是表達式。 – 2011-07-05 09:59:49

4

C中的逗號運算符評估其操作數(它們必須是表達式,而不是語句),丟棄第一個操作數並返回第二個操作數的值。在您的例子:

[childController release], childController = nil; 

編譯器執行以下操作:

  1. 評估[childController release](有效發送-releasechildController),丟棄的返回值(其中,在-release的情況下,爲void);
  2. 評價childController = nil。這是一個賦值表達式,它將第二個操作數(nil)分配給第一個操作數childController,並返回賦值中左側操作數的值;
  3. 返回第二個操作數(childController,其中包含nil)的值。

由於C允許表達式的值不被使用,所以[childController release], childController = nil(即nil)的值被丟棄。

在實際應用中,這是相當於執行:

[childController release]; 
childController = nil; 

但有些程序員喜歡使用,因爲釋放實例變量和分配nil它之間的緊密關係的表達。它清晰可見(並且容易發現錯誤,例如忘記nil作業);比較:

[childController release], childController = nil; 
[someIvar0  release], someIvar0  = nil; 
[someIvar1  release], someIvar1  = nil; 
[someIvar2  release], someIvar2  = nil; 

有:

[childController release]; 
childController = nil; 
[someIvar0  release]; 
someIvar0  = nil; 
[someIvar1  release]; 
someIvar1  = nil; 
[someIvar2  release]; 
someIvar2  = nil; 

這是一個風格問題。

編輯:英子在註釋中提到,以下,不使用逗號操作符,是另一種選擇:

[childController release]; childController = nil; 
[someIvar0  release]; someIvar0  = nil; 
[someIvar1  release]; someIvar1  = nil; 
[someIvar2  release]; someIvar2  = nil; 
+1

然後,您可以始終使用';'在一行中。 :)最後一個例子真的傷害了眼睛... – Eiko

+0

@Eiko Yup,很好的接收。我完全忘了它,它比使用逗號運算符更有意義。 – 2011-07-05 10:05:19