【问题标题】:if (self = [super init]) vs. if ((self = [super init]))if (self = [super init]) 与 if ((self = [super init]))
【发布时间】:2011-03-04 19:21:31
【问题描述】:

刚刚进行代码审查并开始怀疑:

我认为if (self = [super init]) 检查将[super init] 的返回值分配给变量self 是否成功(操作值)。因此(self = nil) 实际上是TRUE

我认为if ((self = [super init])) 在赋值后检查self 的值是多少(变量的值)。因此((self = nil)) 将是FALSE

在初始化您自己的类时,哪种方法是正确的? Apple 文档使用的是前一种 (for example here),我现在实际使用的是这种风格。

【问题讨论】:

    标签: iphone objective-c class initialization


    【解决方案1】:

    他们都做同样的事情。 if 评估的是其中的表达式的值,它是赋值中的赋值。因此,当self 不为零时,您将进入if 块。

    第二种形式会在其周围抛出括号,以使任何潜在的编译器警告关于条件语句内的赋值都静音,这通常是不好的做法,并且可能是错字。但这是惯用的 Objective-C,所以用第一种方式就可以了。

    【讨论】:

    • 感谢您澄清表达式的作用 - 以及为什么我认为必须有额外的括号!现在我回想起在其他环境中收到此类编译器警告并添加第二个括号(当然,在检查表达式后确实做到了我想要的)。
    【解决方案2】:

    正如其他人所说,括号在这种情况下并不重要。如果你明确地检查 nil,它们确实很重要:

    if (self = [super init] != nil) // wrong!
    
    if ((self = [super init]) != nil) // right
    

    就个人而言,我不关心任何一个,但更喜欢在测试之外明确地做作业。这反映了我的编程背景,使我相信布尔值是不同于整数和指针的类型,并且赋值不是表达式,即使在 C 实现的情况下,我错了。

    self = [super init];
    if (self != nil) 
    

    【讨论】:

      【解决方案3】:

      “赋值表达式在赋值之后具有左操作数的值”(C99),所以无论哪种方式,它都有变量的值,正如你所说的那样。额外的括号没有任何区别(可能警告除外)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-21
        • 1970-01-01
        • 1970-01-01
        • 2012-11-22
        • 1970-01-01
        • 2012-11-28
        • 1970-01-01
        相关资源
        最近更新 更多