![](/img/trans.png)
[英]if (self = [super init]) vs. if ((self = [super init]))
[英]iPhone - Use of self = [super init] when [super init] fails
有什么区别:
// 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;
}
他们都做同样的事情,但第一个是常用的,因为苹果建议
第二个是常用的,但它会在新版本的Xcode上引入编译器警告,因此苹果决定将其改为第一个
==
而不是=
。 您可以通过在表达式周围使用另一个(...)
来阻止警告,但这并不容易阅读。 nil
使代码更容易理解(也许这只是我的意见,其他人可以说4比3更好)。 总结:使用1或3.当初始化代码很长时,你应该使用3来避免在一个if
块中使用大多数方法代码。 Apple仅使用1但不盲目追随。 Apple没有记录编码标准,有时他们推荐的是非常值得怀疑的。
您可以使用4而不是3,但不要在代码中混用3和4。
建议1只是因为它很清楚。
2作品,但只是不好的做法。 如果你不需要,不要在你的条件中嵌入逻辑。
3让我头疼。 通常,如果可以,您希望避免否定检查。
4与3相同。
1和2都比3和4更容易阅读,也因为它们是Apple代码中使用的那个; 许多开发人员习惯于1和2。
数字4和3是相同的,好像!self
评估为true,那么它意味着self
是nil
,所以语句return self
是equivelant return nil
。 有些人会说你不应该在方法中有多个退出点(返回),但实际上有多个return语句可以减少if语句的数量(这会降低可读性)
数字2已经很常见了,但是在xcode的最新版本中,你会得到一个编译器警告if和if
语句是否包含单个=
(当你打算使用==
来比较BOOL
值时,这是很多次它是一个错字)。 为了使这个警告保持沉默,你必须用括号括起语句,所以不是if (foo = bar)
而是if ((foo = bar))
但Apple必须意识到Number 2已被大量使用,并且他们在规则中添加了一个例外,所以你使用它现在不会引起编译器警告。
由于Number 2是规则的例外,因此您不应该使用它。 这使得Number 1成为首选方法。
加入战斗..我更喜欢:
if(!(self = [super init]) ) return self;
将所有内容保留在一行上,并且在XCode 4.2中没有警告:D
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.