2011-01-08 178 views
0

下面的方法初始化自我之間有任何區別嗎?關於初始化問題

第一:

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

    } 
    return self; 
} 

二:

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

    } 
    return self; 
} 

我喜歡用初始化自第二種方式。但是當我通過Xcode創建一個新類時,我經常會看到第一種方式,它會自動生成這些代碼。恐怕第二種方式在某些我不知道的情況下會出現一些錯誤。

回答

4

不,他們是一樣的。

第二種方法是剛剛錯過了self

另一種方式,你可能會遇到的第一個任務是這樣的:

- (id)init { 
    if (!(self = [super init])) { 
     return nil; // Bail! 
    } 
    // Further initialisation 

    return self; 
} 

這使得在if語句中的異常情況,並保持碼您希望正常運行(Happy Path)更接近左邊距。

+0

非常感謝。 – AechoLiu 2011-01-08 13:09:47

2

在C和大多數(如果不是全部的話)語言中,這兩個是相同的。

首先

 
a = b; 
if (a) {} 

 
if (a = b) {} 

第一種是隻用一個多行。

然而,它們並不相同

 
if (a == b) {} 
+0

非常感謝。 – AechoLiu 2011-01-08 13:07:59

1

他們是等效的,你可以放心地使用它們中的任。有些人不喜歡使用

if (self = [super init]) 

因爲超載一點點:這意味着「的[super init]的返回值賦給self,然後評估self爲(布爾)條件」。

乍一看,人們可以誤讀的代碼,解釋的賦值運算符=爲是平等關係運算符==,即「比較self[super init]返回的值」,它不是這種情況。

對於C程序員來說,這可能會特別令人困惑。並不是每種編程語言都允許在表達式中進行賦值,也就是說,賦值必須位於單獨的指令中。

+0

非常感謝。 – AechoLiu 2011-01-08 13:08:30

0

兩者在功能上都是等價的,但是使用指定條件表達式的地方會被認爲是不好的編程實踐,因爲它通常是偶然的,例如,G:

if (myVar = 5) { 
    printf("The variable was 5\n"); 
} 

當你真正的意思是寫:

if (myVar == 5) { 
    ... 

但是Objective-C的初始化代碼通常是一個例外,因爲它是一個衆所周知的序列和重複了很多,所以爲了方便有些人可能會選擇在條件表達式中寫入賦值。