![](/img/trans.png)
[英]iPhone - Use of self = [super init] when [super init] fails
[英]if (self = [super init]) vs. if ((self = [super init]))
只是在进行代码审查,并开始怀疑:
我以为if (self = [super init])
检查是否将[super init]
返回值分配给变量self
( 操作的值 )是否成功。 因此(self = nil)
实际上是TRUE
。
我想if ((self = [super init]))
检查赋值后self
的值是什么( variable的值 )。 因此((self = nil))
将为FALSE
。
初始化自己的类时,哪种方法是正确的? Apple文档使用的是前一种( 例如,在此处 ),而我现在正在实际使用这种样式。
他们俩都做同样的事情。 if
评估的是它内部表达式的值,它是赋值中的赋值。 因此,当self
不为零时,您进入if
块。
第二种形式在其周围抛出括号,以使关于条件内部赋值的任何潜在编译器警告均保持沉默,这通常是一种不好的做法,而且可能是拼写错误。 但这是惯用的Objective-C,因此最好采用第一种方法。
正如其他人所说,在这种情况下,括号并不重要。 它们的作用在于您是否明确检查nil:
if (self = [super init] != nil) // wrong!
if ((self = [super init]) != nil) // right
!=的优先级比=高,因此在第一种情况下,您将[super init] != nil
(可能为true)的布尔结果分配给self,然后对if进行测试。
就我个人而言,我也不在乎,但更喜欢在测试之外明确地进行作业。 这反映了我的编程背景,使我相信布尔值与整数和指针是不同的类型,并且赋值不是表达式,即使在C实现的情况下,我错了。
self = [super init];
if (self != nil)
“赋值表达式具有赋值后的左操作数的值”(C99),因此无论哪种方式,赋值表达式都具有variable的值 。 多余的括号没有区别(警告可能除外)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.