以下init self方式之间有什么区别吗?
首先:
- (id)init {
self = [super init];
if (self) {
}
return self;
}
第二
- (id)init {
if (self = [super init]) {
}
return self;
}
我喜欢用第二种方式来创建自我。但是当我通过Xcode创建一个新类时,我经常会看到第一种方法,它会自动生成这些代码。我担心第二种方式会在一些我不知道的情况下出现一些错误。
答案 0 :(得分:4)
不,他们是一样的。
第二种方法错过了self
您可能遇到的另一种方式是:
- (id)init {
if (!(self = [super init])) {
return nil; // Bail!
}
// Further initialisation
return self;
}
这会将异常条件放在if
语句中,并使您希望正常运行的代码(Happy Path)更靠近左边距。
答案 1 :(得分:2)
在C和大多数(如果不是全部)语言中,这两种语言是相同的。
第一
a = b; if (a) {}
第二
if (a = b) {}
第一个是使用另一条线。
但是,它们与
不同if (a == b) {}
答案 2 :(得分:1)
它们是等效的,您可以安全地使用它们中的任何一个。有些人不愿意使用
if (self = [super init])
因为它有点重载:它意味着'将[super init]
的返回值分配给self
,然后将self
评估为(布尔)条件'。< / em>的
乍一看,可能会误读该代码,将赋值运算符=
解释为等式关系运算符==
,即'比较self
与返回的值[super init]
',并非如此。
对于不熟悉C语言的程序员来说,这可能会特别令人困惑。并非每种编程语言都允许在表达式中进行赋值,也就是说,赋值必须在单独的指令中。
答案 3 :(得分:0)
两者在功能上是等价的,但是使用预期条件表达式的赋值不被视为糟糕的编程习惯,因为它通常是偶然的,例如:
if (myVar = 5) {
printf("The variable was 5\n");
}
当你真正打算写:
if (myVar == 5) {
...
然而,Objective-C初始化代码通常是一个例外,因为它是一个众所周知的序列并且重复了很多,所以为方便起见,有些人可能会选择在条件表达式中编写赋值。