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

JOM*_*JOM 21 iphone initialization class objective-c

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

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

我认为if ((self = [super init]))检查self赋值后的值是什么(变量的值).这样((self = nil))就可以了FALSE.

在初始化自己的类时,哪一个是正确的使用方法?Apple文档使用前者(例如这里),我现在正在使用它的样式.

Ben*_*tto 20

他们都做同样的事情.的东西,该if求值是在其内部的表达,其是在分配所分配的值的值.所以当self不是零时,你进入if阻止.

第二种形式抛出它周围的parens来沉默任何潜在的编译器警告有关条件内的赋值,这通常是不好的做法,可能是一个错字.但这是惯用的Objective-C,所以第一种方式做到这一点很好.


Jer*_*myP 13

正如其他人所说,括号在这种情况下并不重要.他们确实重要的是你明确检查nil:

if (self = [super init] != nil) // wrong!

if ((self = [super init]) != nil) // right
Run Code Online (Sandbox Code Playgroud)

!=具有比=更高的优先级所以在第一种情况下,你将[super init] != nil(可能是真的)的布尔结果赋给self,然后对if进行测试.

就个人而言,我不关心任何一个,但更喜欢在测试之外明确地进行任务.这反映了我的编程背景,这使我相信布尔是一个与整数和指针不同的类型,并且赋值不是表达式,即使在C实现的情况下,我也错了.

self = [super init];
if (self != nil) 
Run Code Online (Sandbox Code Playgroud)