【问题标题】:iPhone - Use of self = [super init] when [super init] failsiPhone - 当 [super init] 失败时使用 self = [super init]
【发布时间】:2012-03-21 11:14:25
【问题描述】:

两者有什么区别:

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

// 2 - I guess it's exactly the same as previous
-(id) init {
    if (self = [super init]) {
        ... do init ....
    }
    return self;
}

// 3 - is this one a really bad idea and if yes, Why ?
-(id) init {
    self = [super init];
    if (!self) return nil;

    ... do init ....

    return self;
}

// 4 - I think this one sounds OK, no ? But what is returned... nil ?
-(id) init {
    self = [super init];
    if (!self) return self;

    ... do init ....

    return self;
}

编辑:感谢 Peter M.

// 5 - I really like the readability of this one
-(id) init {
    if(!(self = [super init])) return self;  // or nil

    ... do init ....

    return self;
}

【问题讨论】:

    标签: iphone objective-c inheritance initialization subclass


    【解决方案1】:

    他们都做同样的事情,但第一个是常用的,因为苹果建议

    第二个是常用的,但它会在新版本的 Xcode 中引入编译器警告,因此苹果决定将其更改为第一个

    【讨论】:

      【解决方案2】:

      建议1只是因为它很清楚。

      2 有效,但只是不好的做法。如果不需要,请不要在条件中嵌入逻辑。

      3 让我头疼。通常,您希望尽可能避免否定检查。

      4 与 3 相同。

      【讨论】:

      • 避免负检查?为什么?任何编码标准实际上都会推荐 3。
      • Sulthan,你能给我指点这方面的任何资源吗?在我看来,如果 Apple 不决定使用 3,那么 1 我们可能会更好。 ;-)
      • 你读过苹果的例子吗? :) 他们的代码通常完全不可读,所以我永远不敢说“Apple 使用它,这就是它更好的原因”。我无法提供任何链接 - 编码标准通常基于人们的经验,我找不到任何可以涵盖该主题的链接。您会将函数/方法的整个主体嵌套在一个if 语句中吗?为什么init 方法要特别?
      • 我累了,没有发现错误——毕竟英语不是我的母语。
      【解决方案3】:
      1. 苹果常用的一种
      2. 同样如此,但编译器不知道您是否指的是== 而不是=。您可以通过在表达式周围使用另一个 (...) 来阻止警告,但这并不容易阅读。
      3. 任何良好的编码标准(通常不是单行代码,而是带有护腕)都会首选此代码。当您的初始化代码很长时,这会显着提高可读性。
      4. 与 3 相同,但您会失去一些可读性。返回nil 让代码更容易理解(也许这只是我的看法,别人可以说4比3好)。

      总结:使用 1 或 3。当初始化代码较长时,应使用 3 以避免将大部分方法代码放在一个 if 块中。苹果只用了 1 但不要盲目跟风。 Apple 没有记录在案的编码标准,有时他们推荐的内容非常值得怀疑。

      您可以使用 4 代替 3,但不要在代码中混合使用 3 和 4。

      【讨论】:

        【解决方案4】:

        1 和 2 都比 3 和 4 更容易阅读,这也是因为它们是 Apple 代码中使用的;许多开发人员习惯了 1 和 2。

        数字 4 和 3 相同,如果 !self 评估为真,则意味着 self 是 nil,因此声明 return self 等价于 return nil。有人会说你不应该在一个方法中有多个退出点(返回),但实际上拥有多个返回语句可以减少 if 语句的数量(这会降低可读性)

        数字 2 很常见,但是在最新版本的 xcode 中,如果 if 语句包含单个 =(很多时候这是一个错字,当您打算使用 @987654328 时,您会收到编译器警告) @ 比较 BOOL 值)。要使此警告静音,您必须用括号将语句括起来,因此您将使用 if ((foo = bar)) 而不是 if ((foo = bar))
        但是 Apple 肯定已经意识到 Number 2 被大量使用,并且他们在规则中添加了一个例外,所以你现在使用它不会导致编译器警告。

        由于数字 2 是该规则的一个例外,因此您不应该真正使用它。所以这使得 1 号成为首选方法。

        【讨论】:

          【解决方案5】:

          加入战斗..我更喜欢:

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

          将所有内容集中在一行上,并且在 XCode 4.2 中没有警告:D

          【讨论】:

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