2012-03-02 70 views
2

是什麼beetween的區別:iPhone - 使用自= [超級初始化]時,[超級INIT]失敗

// 1 
-(id) init { 
    self = [super init]; 
    if (self) { 
     ... do init .... 
    } 
    return self; 
} 

// 2 - I guess it's exactly the same as previous 
-(id) init { 
    if (self = [super init]) { 
     ... do init .... 
    } 
    return self; 
} 

// 3 - is this one a really bad idea and if yes, Why ? 
-(id) init { 
    self = [super init]; 
    if (!self) return nil; 

    ... do init .... 

    return self; 
} 

// 4 - I think this one sounds OK, no ? But what is returned... nil ? 
-(id) init { 
    self = [super init]; 
    if (!self) return self; 

    ... do init .... 

    return self; 
} 

編輯:彼得M.上架感謝

// 5 - I really like the readability of this one 
-(id) init { 
    if(!(self = [super init])) return self; // or nil 

    ... do init .... 

    return self; 
} 

回答

3
  1. 常見的一個使用蘋果
  2. 不相同,但編譯器不知道你不是故意==,而不是=。您可以通過在表達式周圍使用另一個(...)來阻止警告,但這並不容易閱讀。
  3. 這一個將是優選的任何良好的編碼標準(通常不作爲一個班輪,但與護腕)。當你的初始化代碼很長時,這個代碼顯着提高了可讀性。
  4. 與3相同,但您失去了一些可讀性。返回nil使代碼更容易理解(也許這只是我的看法,別人可以說4比3好)。

總結:使用1或3.當初始化代碼很長時,應該使用3以避免在一個if塊中擁有大多數方法代碼。 Apple只使用1個,但不要盲目追隨它。蘋果公司沒有文件編碼標準,有時他們推薦的是非常有問題的。

您可以使用4而不是3,但不要在代碼中混用3 & 4。

4

他們都做同樣的東西,但第一個是常用的,因爲蘋果建議

第二個是常用的,但它會在新版本的Xcode引入編譯器警告,所以蘋果決定將其更改爲第一個

1

建議僅僅因爲它很清楚。

2作品,但只是不好的做法。如果你不需要,不要在你的條件中嵌入邏輯。

3讓我頭疼。通常,如果可以的話,你希望避免負面檢查。

4相同3.

+0

避免消極的檢查?爲什麼? 3將實際上由任何編碼標準推薦。 – Sulthan 2012-03-03 00:05:56

+0

蘇丹,你能指點我嗎?從我的觀點來看,如果蘋果沒有決定使用3,那麼我們可能會更好。 ;-) – joshis 2012-03-03 00:12:57

+0

你有沒有讀過蘋果的例子? :)他們的代碼通常絕對不可讀,所以我永遠不敢說「蘋果使用它,這就是爲什麼它更好」。我無法提供任何鏈接 - 編碼標準通常基於人們的經驗,我無法找到任何涵蓋該主題的內容。你會在一個if語句中嵌套函數/方法的全部內容嗎?爲什麼'init'方法應該是特殊的? – Sulthan 2012-03-03 01:17:44

1

1和2都比3和4更容易閱讀,也因爲它們是蘋果代碼中使用的;許多開發用於1和2

號4和3是相同的,就好像!self評估爲真,那麼就意味着selfnil,因此該語句return self是equivelant到return nil。有些人會說你不應該有一個方法中的多個退出點(返回),但實際上有多個返回語句可以減少if語句的數量(這會降低可讀性)

2號已經很普遍,然而在xcode的最新版本中,如果和if語句包含單個=(如果打算使用==來比較BOOL值,那麼這是錯誤的次數很多),您將收到編譯器警告。爲了消除這個警告,你必須用括號括住語句,所以不是if (foo = bar)你應該有if ((foo = bar))
但是Apple一定已經意識到Number 2被使用了很多,並且他們在規則中增加了一個例外,所以你使用它將會現在不會導致編譯器警告。

由於數字2是規則的例外,所以您不應該使用它。所以這使得1號是首選的方法。

1

爲了增加磨損。我喜歡:

if(!(self = [super init])) return self; 

保持這一切在同一行,並沒有警告XCode中4.2:d