2012-03-15 87 views
12

我一直在宗教上做了幾年。檢查的self有效性調用[super init...]方法後:爲什麼我們都在init方法中檢查if(self)?

self = [super init]; 
if (self != nil) { 
    // initialize 
} 
return self; 

您可以通過多種方式做到這一點,因爲好聽this question總結了,但問題是關於語法,我的是這個概念。

我最近從一個學習Objective-C的同事那裏得到了一個問題,他問我「爲什麼我應該測試自己的存在,是不是很明顯它在那裏?我的簡短回答是「錯,是的,有些情況下可能會失敗,所以這就是原因。」但漫長的回答是,我真的不明白爲什麼我們在任何地方進行測試,當它發生失敗的情況非常罕見。 Apple's reference guide告訴我們一些特定的情況,例如初始化文件或處理單例時。但這些聽起來像是[super init] s應該正常工作的規則的非常罕見的例外。

所以我對你的問題是這樣的:爲什麼我們總是測試自我的有效性?我們是否只是在所有地方實施它,以便在發生這種情況時捕捉到這種異常?爲什麼不跳過整個if (self)的事情,並初始化我們的對象,如果它成功的機會是100%(或從未如此)?

P.S.我意識到這個問題必須是一個愚蠢的做法,因爲它非常基礎,但是我的搜索查詢還有很多關於初始化語法的其他問題。杜佩鏈接表示讚賞,歡呼!

+3

可能重複[在Objective-C中,爲什麼我應該檢查self = \ [super init \]是不是nil?](http://stackoverflow.com/questions/1287950/in-objective-c-why-應該我檢查,如果自我超級初始化不是零) – JeremyP 2012-03-15 15:58:39

回答

6

這裏的a helpful old article關於這個問題,還包括一些關於初始化的常見誤解。我想說的基本思想是,一個特定的類不應該擔心它的超類的實現,所以我們總是檢查nil在出現錯誤的情況下。

+1

鏈接的文章是現貨。不幸的是,在這個話題上有很多關於錯誤的信息,其中包括一些知名的Wil Shipley(雖然Wil已經在底部更正了他在這個主題上的發帖,但我不會鏈接到它,因爲它幾乎沒有添加任何關於Mike Ash與回答者聯繫的文章。) – ipmcc 2012-03-15 13:23:05

+0

該文章確實有幫助,回答了我的所有問題,然後回答了一些問題。謝謝@ jtbandes! – epologee 2012-03-15 22:38:37

1

呃...這絕對是一個很好的問題,我希望我已經做到了。 我不是在Objective-C的專家,但我會盡量給我的意見,而不用擔心downvoter的:-)

我能感覺到你的無奈,但:

err, yeah, well there's instances where it can fail, so that's why. 

這是一個非常好的回答。 我認爲你沒有檢查自己,但你正在檢查超級對象是否正確初始化,對我來說這是一個不同的觀點。

我想在任何情況下,檢查對象是否已被正確分配和初始化都是很好的做法,特別是在所有僞裝內存分配問題中位於C頂部的objective-c中。初始化在'alloc'之後,它應該用變量等初始化分配的對象...

例如,在類似Java的語言中,構造函數的鏈由編譯器定義好並檢查,未能構造在稍後使用該對象時,對象將導致空指針錯誤。通常Java中的對象分配是無錯誤的,但通常使用的方法必須包含特設的try/catch錯誤塊。因此該檢查稍後會在應用程序生命週期中進行。

在objective-c中,您可能會有一個零對象,原因很多,如果沒有應用程序崩潰,您可以將消息發送給無效對象。 我必須誠實地說,當直接從NSObject的子類實例化時,我不知道檢查nil的效用。但是,如果我在一個框架或者其他人提供的靜態庫中擴展一個類,我肯定會感到安全,並檢查對象的有效性。

相關問題