2015-06-02 50 views
1

我在一個例子中看到了這個 - 在一個類初始化中,這個行有沒有任何目的?在Objective C中,爲什麼在類中使用`self == [className self]`初始化?

+(void)initialize 
{ 
    if (self == [ToolController self]) 
    { 
     ... 
    } 
} 

我讀過,在類方法中,self指的是類而不是對象。所以從理論上講,這種檢查總是會導致真實性嗎?

在我的腦海裏,這條線將解決這個: ToolController == ToolController

所以這就是爲什麼我會認爲它總會導致如此。我錯過了什麼嗎?

+0

如果有'ToolController'的子類會發生什麼? – Darren

+0

我很確定原因是在文檔初始化中給出的。 – Sulthan

+0

「重複」問題不是重複問題。這是一個稍微相關的問題,碰巧有相同的答案。重複的問題實際上應該問同樣的問題,而不僅僅是有類似的答案。 – rmaddy

回答

3

我想你錯過了ToolController的self子類的可能性。

想必你正在閱讀的例子,無論是在+[ToolController initialize]應該發生的事情,只有當超(ToolController)初始化發生,沒有發生另外ToolController初始化的任何子類。

+0

更詳細的解釋[文檔for'+ [NSObject initialize]'](https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/index.html#//apple_ref/occ/clm/ NSObject的/初始化)。 –

+0

嗯,這是有道理的,沒有意識到,這個子類也在調用它。大多數時候,我很難爲self == [className self]形成一個google查詢。乾杯:) –

2

從Apple文檔上NSObjectinitialize

超類實現可多次調用,如果子類沒有實現初始化,運行時將調用繼承的實現,或者,如果子類顯式調用[超級初始化]。如果你想保護自己免受多次運行,你可以在構造實現沿着這些線路:

+ (void)initialize { 
    if (self == [ClassName self]) { 
    // ... do the initialization ... 
    } 
} 

正如你不能假設每將覆蓋initialize方法(事實上, 大多數可能不會),最好的做法是檢查課程實際上是您所期望的。

相關問題