有什么区别:
// 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;
}
答案 0 :(得分:4)
他们都做同样的事情,但第一个是常用的,因为苹果建议
第二个是常用但它会在新版本的Xcode上引入编译器警告,所以苹果决定将其改为第一个
答案 1 :(得分:3)
==
而不是=
。您可以通过在表达式周围使用另一个(...)
来阻止警告,但这并不容易阅读。nil
会让代码更容易理解(也许这只是我的意见,其他人可以说4优于3)。总结:使用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