首选哪种形式的Objective-C初始方法?

首选哪种形式的Objective-C初始方法?,objective-c,idioms,Objective C,Idioms,到目前为止,我已经看到了三种方法: 1: 2: 3: 哪种形式更惯用Objective-C?都是一样的,没关系。不过,我建议使用前两种方法中的一种。最后一个很少做 你可能找不到苹果在这方面的任何建议。它们声明,您应该将super的init返回值设置为self。如何做到这一点取决于你自己 这三种方法都是正确的,我们通常都是这样做的 - (id) init { self = [super init]; if (self != nil) { // your c

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

1:

2:

3:


哪种形式更惯用Objective-C?

都是一样的,没关系。不过,我建议使用前两种方法中的一种。最后一个很少做

你可能找不到苹果在这方面的任何建议。它们声明,您应该将super的init返回值设置为self。如何做到这一点取决于你自己


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

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

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

    return self;
}

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

- (id)init
{
    self = [super init];
    if (self) {
        <#initializations#>
    }
    return self;
}
-(id)init
{
self=[super init];
如果(自我){
}
回归自我;
}
  • 最“现代”的方法(默认情况下在Xcode 4中使用)

  • 旧版本Xcode中的默认值

    - (instancetype)init
    {
        if (self = [super init])
        {
            // Initialization code here.
        }
        return self;
    }
    
  • 虽然“合法”,但这是非常罕见的,我不推荐它


  • 传统上,在Objective-C 1.0中,init方法返回
    id
    ,从Objective-C 2.0的最新迭代开始,建议返回
    instancetype

    请引用Apple/NextStep/Objective-C文档或其他公认权威机构的支持性参考,我不是真的在寻找J.Random Developer的意见。请查看一个好的解释。它的情况和开发商必须作出选择。第3号需要有一个早期回报的价值。我知道这是一个“关闭的风险”,当我写它的时候,但我会争辩说,这是迄今为止的答案是没有建设性的,而不是任何固有的问题。我投票重新开放,因为它现在有超过1000个意见“流行问题”,因此很有用,并且公认的答案引用了有效的引用(现代和历史的Xcode默认值)。的确如此。这确实是一个品味问题。objC 2.0很长时间以来也使用id来实现此目的。与objC 2.0时代相比,instancetype的引入是一个相对较新的事件。
    - (id) init
    {
        self = [super init];
    
        if (self != nil)
        {
            // your code here
        }
    
        return self;
    }
    
    - (id)init
    {
        self = [super init];
        if (self) {
            <#initializations#>
        }
        return self;
    }
    
    - (instancetype)init
    {
        self = [super init];
        if (self) {
            // Initialization code here.
        }
        return self;
    }
    
    - (instancetype)init
    {
        if (self = [super init])
        {
            // Initialization code here.
        }
        return self;
    }