【问题标题】:Which form of Objective-C init method is preferred? [closed]哪种形式的 Objective-C 初始化方法是首选? [关闭]
【发布时间】:2013-03-27 09:40:45
【问题描述】:

到目前为止,我已经看到了三种方式:

1:

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

2:

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

3:

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

Objective-C 哪种形式更惯用?

【问题讨论】:

  • 请引用来自 Apple/NextStep/Objective-C 文档或其他公认权威的支持参考资料,我并不是在寻找 J. Random Developer 的意见。
  • 检查stackoverflow.com/questions/2956943/… 以获得很好的解释。它的情况和必须做出选择的开发人员。
  • 数字3需要有一个值才能提前返回。
  • 我在写这篇文章时就知道这是一个“关闭风险”,但我认为到目前为止的答案没有建设性,而不是问题中固有的任何内容。
  • 我投票决定重新打开,因为有超过 1000 次查看它现在是一个“热门问题”,因此很有用,并且接受的答案引用了有效的参考资料(现代和历史 Xcode 默认值)。

标签: objective-c idioms


【解决方案1】:
  1. 最“现代”的方法(在 Xcode 4 中默认使用)。

    - (instancetype)init
    {
        self = [super init];
        if (self) {
            // Initialization code here.
        }
        return self;
    }
    
  2. 旧版本 Xcode 中的默认设置。

    - (instancetype)init
    {
        if (self = [super init])
        {
            // Initialization code here.
        }
        return self;
    }
    
  3. 虽然“合法”但很少见,我不会推荐它。

传统上,在 Objective-C 1.0 中,init 方法返回 id,在 Objective-C 2.0 的更新版本中,建议改为返回 instancetype

【讨论】:

  • objC 2.0 长期以来也将 id 用于此目的。与 objC 2.0 时代相比,instancetype 的引入是一个相对较新的事件。
【解决方案2】:

一切都一样,没关系。我建议使用前两个中的一个。最后一个很少完成。

您可能找不到 Apple 提供的有关此级别的任何建议。他们声明,您应该将超级的 init 的返回值设置为 self。如何做到这一点取决于您。

Implementing an Initializer

【讨论】:

  • 确实如此。这真的是一个品味问题。
【解决方案3】:

这三种方法都是正确的,我们通常会这样做。

- (id) init
{
    self = [super init];

    if (self != nil)
    {
        // your code here
    }

    return self;
}

【讨论】:

    【解决方案4】:

    首选第一个或第二个。无需检查它是否为 nil,因为“if”条件会自动检查。以下是使用 init 的标准方式。

    - (id)init
    {
        self = [super init];
        if (self) {
            <#initializations#>
        }
        return self;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      相关资源
      最近更新 更多