刚刚进行代码审查并开始怀疑:
我认为if (self = [super init])
会检查将[super init]
的返回值分配给变量self
是否成功(操作值)。因此(self = nil)
实际上是TRUE
。
我认为if ((self = [super init]))
会在分配后检查self
的值是什么(变量值)。因此((self = nil))
将是FALSE
。
在初始化自己的课程时,哪一个是正确的使用方法? Apple文档使用前者(for example here),我现在正在使用它。
答案 0 :(得分:20)
他们都做同样的事情。 if
计算的内容是其中的表达式的值,它是赋值中的赋值。因此,当self
不为零时,您将进入if
块。
第二种形式抛出围绕它的parens,以使任何潜在的编译器警告有关条件内的赋值,这通常是不好的做法,可能是一个错字。但这是惯用的Objective-C,所以第一种方式就可以了。
答案 1 :(得分:12)
正如其他人所说,括号在这种情况下并不重要。他们确实重要的是你明确检查nil:
if (self = [super init] != nil) // wrong!
if ((self = [super init]) != nil) // right
!=的优先级高于=所以在第一种情况下,你将[super init] != nil
的布尔结果(可能是真的)赋给self,然后对if进行测试。
就个人而言,我也不关心,但更喜欢在测试之外明确地进行任务。这反映了我的编程背景,这让我相信布尔是一个与整数和指针不同的类型,并且赋值不是表达式,即使在C实现的情况下,我也错了。
self = [super init];
if (self != nil)
答案 2 :(得分:4)
“赋值表达式在赋值后具有左操作数的值”(C99),因此,无论哪种方式,它都具有的变量值,就像你所说的那样。额外的括号没有区别(可能除了警告之外)。