首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS - viewDidUnload奇怪的调用

iOS - viewDidUnload奇怪的调用
EN

Stack Overflow用户
提问于 2011-07-05 17:36:57
回答 2查看 154关注 0票数 0

我一直在读“开始iPhone 4开发”这本书,他们有一个关于使用导航控制器的教程。在本教程中,我们将视图控制器(名为childController)推送到视图上。但是因为我们不想为其他类“暴露”这个控制器,所以我们没有为它创建任何访问器方法。因此,作者在viewDidUnload中写道:

代码语言:javascript
复制
- (void)viewDidUnload {
    [childController release], childController = nil;
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

我真的不明白释放后的逗号?这段代码实际上对我是有效的。我没有收到任何错误或内存泄漏。

但据我所知,它不应该是这样的:

代码语言:javascript
复制
- (void)viewDidUnload {
    [childController release]; 
    childController = nil;
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-05 17:42:28

代码语言:javascript
复制
 [childController release], childController = nil;

这是普通的C语言,comma operator的目标是“排序”表达式。实际上,在这种情况下,它完全等同于:

代码语言:javascript
复制
[childController release];
childController = nil;

唯一变化的是可读性(无论是更坏还是更好,这取决于...)

但一般来说,排序操作符的计算结果是最后一个语句的值(即,除了最后一个操作数之外,所有操作数的值都会被丢弃)。

代码语言:javascript
复制
int a, b;
int c = (a = 1), (b = 2);

在执行此语句后,c将为2。

编辑:从我添加的链接:

除了在

循环的第一个和第三个控制表达式中,几乎没有任何理由在任何地方使用逗号运算符,实际上,您在C程序中看到的大多数逗号都不是逗号运算符。特别是,函数调用中参数之间的逗号不是逗号运算符;它们只是分隔几个参数表达式的标点符号。很容易看出,它们不能是逗号操作符,否则在像这样的调用中

编辑:一个更好的例子:

代码语言:javascript
复制
int a = 1;
int b = 2;
b = printf("%d, %d", a,b), a+b;

这将首先打印:

代码语言:javascript
复制
1, 2

然后将3赋值给b。

票数 3
EN

Stack Overflow用户

发布于 2011-07-05 17:53:59

C中的逗号运算符计算两个操作数(它们必须是表达式,而不是语句),丢弃第一个操作数并返回第二个操作数的值。在您的示例中:

代码语言:javascript
复制
[childController release], childController = nil;

编译器执行以下操作:

  1. 评估[childController release] (有效地将-release发送到childController)并丢弃返回值(对于-release,返回值为void);
  2. Evaluate childController = nil )。这是一个赋值表达式,它将第二个操作数(nil)赋值给第一个操作数childController,并返回包含nil).

的第二个操作数(nil)的值

由于C允许不使用表达式的值,因此将丢弃[childController release], childController = nil (即nil)的值。

实际上,这相当于执行以下操作:

代码语言:javascript
复制
[childController release]; 
childController = nil;

但是一些程序员更喜欢使用这个表达式,因为释放实例变量和将nil赋值给它之间有着紧密的关系。它在视觉上是清晰的(并且很容易发现错误,例如忘记了nil赋值);比较:

代码语言:javascript
复制
[childController release], childController = nil;
[someIvar0       release], someIvar0       = nil;
[someIvar1       release], someIvar1       = nil;
[someIvar2       release], someIvar2       = nil;

通过以下方式:

代码语言:javascript
复制
[childController release]; 
childController = nil;
[someIvar0       release]; 
someIvar0       = nil;
[someIvar1       release]; 
someIvar1       = nil;
[someIvar2       release]; 
someIvar2       = nil;

这是一个风格问题。

编辑: Eiko在评论中提到,以下是另一种选择,不使用逗号运算符:

代码语言:javascript
复制
[childController release]; childController = nil;
[someIvar0       release]; someIvar0       = nil;
[someIvar1       release]; someIvar1       = nil;
[someIvar2       release]; someIvar2       = nil;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6580606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档