【问题标题】:Are these two instancetype initialization methods equal?这两个实例类型初始化方法是否相等?
【发布时间】:2021-06-26 10:20:57
【问题描述】:

我想知道这两个是否相等:

if 语句中的单括号:

- (instancetype)init {
    
    if (self = [super init]) {
        
        // ...
    }
    
    return self;
}

if 语句中的双括号:

- (instancetype)init {
    
    if ((self = [super init])) {
        
        // ...
    }
    
    return self;
}

【问题讨论】:

    标签: ios objective-c initialization instancetype


    【解决方案1】:

    是的,......因为它只取决于被比较的表达式,无论存在多少括号(应该是偶数)

    括号帮助编译器理解具有优先级的表达式,目标c中的if语句至少需要一个(),而添加更多也可以,但是没用

    【讨论】:

      【解决方案2】:

      是的,他们是平等的。

      self 在调用[super init] 后得到它需要存储的引用。两者都做同样的事情。

      【讨论】:

        【解决方案3】:

        它们是相同的,因为它们的含义相同并产生相同的代码,但是编译器的行为会有所不同。

        在类似 C 的语言中,在输入 =(即 assignment)时,输入==(即equality)时,容易出现视觉上难以发现的简单输入错误。这个错误会产生非常不同的结果并且很难发现错误。例如:

        if (a == b) { ... }
        

        测试ab 是否具有相同的值,如果是,则执行if 中的语句。然而:

        if (a = b) { ... }
        

        b 中的值分配给a,然后如果ab 的值(由于分配而具有相同的值)非零,则执行语句。显然这两种行为是完全不同的。

        如果编译器在if 中看到单个=,它会发出警告以提醒程序员注意可能存在拼写错误。如果使用双括号,警告将被省略:

        if ((a = b)) { ... }
        

        这就是为什么您会在代码中看到这种模式。高温

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多