if(self = [super init])vs if((self = [super init]))

时间:2010-06-17 05:57:32

标签: iphone objective-c class initialization

刚刚进行代码审查并开始怀疑:

我认为if (self = [super init])会检查将[super init]的返回值分配给变量self是否成功(操作值)。因此(self = nil)实际上是TRUE

我认为if ((self = [super init]))会在分配后检查self的值是什么(变量值)。因此((self = nil))将是FALSE

在初始化自己的课程时,哪一个是正确的使用方法? Apple文档使用前者(for example here),我现在正在使用它。

3 个答案:

答案 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),因此,无论哪种方式,它都具有的变量值,就像你所说的那样。额外的括号没有区别(可能除了警告之外)。