2012-04-12 37 views

回答

12

快速的回答是,你告訴你的類的超類初始化對象。因爲您從該超類繼承,那麼您可以執行特定於您的實現的其他初始化任務,但首先必須確保執行初始化的基礎知識(由基類NSObject處理)。每個從另一個類繼承(繼承)的類必須確保它們的超類在初始化之前已經被初始化。

一個非常快速的(因此可能相當差)模擬 - 在你可以創建之前,你的父母必須創建(超級類),他們必須首先創建他們的父母(他們的超類)

我建議你搜索麪向對象的編程基礎知識來了解這類事情。

+4

+2的答案,-1視覺我的父母:) – jmstone617 2012-04-12 13:21:50

-1

NSObject是根類。 https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html 你可以在那裏找到一個init方法。在NSObject類中的init方法是Objective-C中每個對象的初始化程序。 super只是返回一個對象的超類。

如果Class B繼承自Class A,Class A將是超類Class B。繼續從Class B繼承的另一個類Class CClass C的超類將爲Class B。等等。

當你從一個類呼叫[super init];時,它只需調用其超類的方法init,然後調用其超類的方法init等等。最後它會到達根對象NSObject,並調用真正的方法init。此時,iOS將爲您的對象分配內存,併爲您的對象分配必要的數據結構。閱讀有關NSObject類中每個方法和屬性的文檔。

如果您創建了類MyView,它是UIView的子類,則您的類層次結構將爲。

 NSObject 

UIAppearanceContainer 

    UIAppearance 

    NSCoding 

     UIView 

     MyView 

所以,當你調用init方法在你的類 'MyView的',它會調用

的UIView

的init方法

的UIView將調用NSCoding

的init方法

NSCoding會調用初始化UIAppearance的方法

UIAppearance將調用UIAppearanceContainer的初始化方法

UIAppearanceContainer將調用NSObject的init方法。

+0

在上面的例子的第二步,UIView會自動調用NSCoding的init方法,或者我們需要在UIView中編寫另一個self = super init? – user1232250 2012-04-12 13:46:31

+0

在UIView裏面有一個調用self = [super init]和每個方法一樣 – rakeshNS 2012-04-12 13:53:11

+0

我想知道這個答案有什麼問題。請輸入你的評論(向誰投下了這個答案:))。 – rakeshNS 2012-05-28 10:47:57

0

您提到的「檢查」讓我覺得您看到=作爲比較操作。不是。這是一項任務。有時,分配會出現在if條件中。這是利用賦值表達式具有值的事實 - 分配的值。因此,if (self = [super init])結合了「超級的呼叫-init方法」,「分配結果到self」,「檢查我們是否從超級的-init」(即,超級未初始化)得到非零。

因爲這種組合分配和測試可能會造成混淆,而且容易出錯,Apple現在建議從退房分離失敗的任務:

self = [super init]; 
if (self) 
    // ... continue initializing ... 
+0

是非零等於零? – user1232250 2012-04-16 14:41:32

+0

在C中,對於布爾測試,任何非零值都爲true。 NULL指針和'nil'轉換爲零,因此布爾測試爲false。 – 2012-04-16 20:43:33

相關問題