gpt4 book ai didi

iOS - viewDidUnload 奇怪的调用

转载 作者:行者123 更新时间:2023-11-28 18:14:27 27 4
gpt4 key购买 nike

我一直在阅读“iPhone 4 开发入门”一书,他们有一个使用导航 Controller 的教程。在本教程中,我们将 View Controller (名为 childController)推送到 View 上。但是因为我们不想为其他类“公开”这个 Controller ,所以我们没有为它创建任何访问器方法。所以在 viewDidUnload 中,作者写了:

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

release后的逗号真的看不懂?这段代码实际上对我有用。我没有收到任何错误或内存泄漏。

但据我了解,它不应该是这样的:

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

最佳答案

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

[childController release], childController = nil;

编译器执行以下操作:

  1. 评估 [childController release](有效地将 -release 发送到 childController)并丢弃返回值(在 -release, is 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;

这是一个风格问题。

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

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

关于iOS - viewDidUnload 奇怪的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6580606/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com