【问题标题】:Are these two instancetype initialization methods equal?这两个实例类型初始化方法是否相等?
【发布时间】:2021-06-26 10:20:57
【问题描述】:
我想知道这两个是否相等:
if 语句中的单括号:
- (instancetype)init {
if (self = [super init]) {
// ...
}
return self;
}
if 语句中的双括号:
- (instancetype)init {
if ((self = [super init])) {
// ...
}
return self;
}
【问题讨论】:
标签:
ios
objective-c
initialization
instancetype
【解决方案1】:
是的,......因为它只取决于被比较的表达式,无论存在多少括号(应该是偶数)
括号帮助编译器理解具有优先级的表达式,目标c中的if语句至少需要一个(),而添加更多也可以,但是没用
【解决方案2】:
是的,他们是平等的。
self 在调用[super init] 后得到它需要存储的引用。两者都做同样的事情。
【解决方案3】:
它们是相同的,因为它们的含义相同并产生相同的代码,但是编译器的行为会有所不同。
在类似 C 的语言中,在输入 =(即 assignment)时,输入==(即equality)时,容易出现视觉上难以发现的简单输入错误。这个错误会产生非常不同的结果并且很难发现错误。例如:
if (a == b) { ... }
测试a 和b 是否具有相同的值,如果是,则执行if 中的语句。然而:
if (a = b) { ... }
将b 中的值分配给a,然后如果a 和b 的值(由于分配而具有相同的值)非零,则执行语句。显然这两种行为是完全不同的。
如果编译器在if 中看到单个=,它会发出警告以提醒程序员注意可能存在拼写错误。如果使用双括号,警告将被省略:
if ((a = b)) { ... }
这就是为什么您会在代码中看到这种模式。高温