关于init问题

时间:2011-01-08 12:21:12

标签: iphone cocoa-touch

以下init self方式之间有什么区别吗?

首先:

- (id)init {
   self = [super init];
   if (self) {

   }
   return self;
}

第二

- (id)init {
   if (self = [super init]) {

   }
   return self;
}

我喜欢用第二种方式来创建自我。但是当我通过Xcode创建一个新类时,我经常会看到第一种方法,它会自动生成这些代码。我担心第二种方式会在一些我不知道的情况下出现一些错误。

4 个答案:

答案 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初始化代码通常是一个例外,因为它是一个众所周知的序列并且重复了很多,所以为方便起见,有些人可能会选择在条件表达式中编写赋值。