iPhone - 当[super init]失败时使用self = [super init]

时间:2012-03-02 23:48:10

标签: iphone objective-c inheritance initialization subclass

有什么区别:

// 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;
}

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

  1. Apple使用的常用词
  2. 是否相同,但编译器不知道您是不是==而不是=。您可以通过在表达式周围使用另一个(...)来阻止警告,但这并不容易阅读。
  3. 任何良好的编码标准(通常不是单线,而是带有护腕)都是首选。当您的初始化代码很长时,这会显着提高可读性。
  4. 与3相同,但你失去了一些可读性。返回nil会让代码更容易理解(也许这只是我的意见,其他人可以说4优于3)。
  5. 总结:使用1或3.当初始化代码很长时,您应该使用3来避免在一个if块中使用大多数方法代码。 Apple仅使用1但不盲目追随。 Apple没有记录编码标准,有时他们推荐的内容非常值得怀疑。

    你可以用4而不是3但不要混用3&你的代码中有4个。

答案 2 :(得分:1)

建议

1只是因为它很清楚。

2作品,但这只是不好的做法。如果你不需要,不要在你的条件中嵌入逻辑。

3让我头疼。通常,如果可以,您希望避免否定检查。

4与3相同。

答案 3 :(得分:1)

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

4号和3号是相同的,好像!self评估为真,那么self表示nil,所以语句return self与{return nil等同1}}。有些人会说你不应该在方法中有多个退出点(返回),但实际上有多个return语句可以减少if语句的数量(这会降低可读性)

第2号已经很常见,但是在xcode的最新版本中,如果if语句包含单个=,则会收到编译器警告(很多时候它是一个拼写错误,当你想要的时候使用==来比较BOOL值)。要使此警告静音,您必须用括号括起声明,因此if (foo = bar)代替if ((foo = bar)) 但Apple必须意识到Number 2已被大量使用,并且他们在规则中添加了一个例外,所以你使用它现在不会引起编译器警告。

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

答案 4 :(得分:1)

加入战斗......我更喜欢:

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

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