2011-07-05 47 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