2013-04-10 60 views
0

我已經研究過關於init和初始化器概念的書籍和多個論壇帖子,但是我仍然無法在指定的初始化程序周圍找到我的頭。指定初始值設定項的代碼是什麼樣的?

它的代碼是什麼樣的?

在下面的代碼中,哪些代碼行是指定的初始化程序?

-(Fraction *) initWith (int) n over: (int) d 
{ 
    self = [ super init]; 
    if (self) 
     [self setTo: n over: d ]; 
    return self; 
} 

謝謝。

回答

2

每個初始化程序必須在其實現中調用指定的初始化程序。

在這種情況下,[super init]調用是對類的超類初始化程序的調用,所以這很可能是設計的初始化程序本身。

根據具體的類別,指定的初始值設定項可能不止一個。爲了找到那些,你需要檢查文檔。

例如UIView有兩個指定初始化

  • -initWithFrame:
  • -initWithCoder:

,你必須調用這兩個中的一個在任何其他初始化你可能在你的自定義UIView子類。

有關詳細信息,請參閱Multiple Initializers and the Designated Initializer(感謝西莫)

+2

有關更多詳細信息,請參閱http://developer.apple.com/library/ios/#documentation/general/conceptual/CocoaEncyclopedia/Initialization/Initialization.html – 2013-04-10 22:39:11

+1

中的「多個初始化程序和指定初始化程序」小澄清:' [super init]'是對*超類的*初始化程序的調用 - 它不是所討論類的指定初始值設定項。 – Chuck 2013-04-10 22:52:52

4

你有點無所適從短語「指定初始化」的意思。一個班級可能有幾個初始者。我們來看一個虛構的貓類。這可能有以下初始化:

- init 
- initWithName: 
- initWithName:breed: 
- initWithName:breed:age: 

指定初始化是實際執行的是類的初始化並通過對super調用之一。最後一個,initWithName:breed:age可能是指定的初始化程序,因爲它獲取的數據最多。它可能是這樣實現的:

- (id)initWithName:(NSString *)name breed:(CatBreed)breed age:(NSUInteger)age { 
    if (self = [super init]) { 
     _name = [name copy]; 
     _breed = breed; 
     _age = age; 
    } 
    return self; 
} 

這可以完成設置實例的所有工作。其他初始化程序將根據這個實現。例如,另外一個可能實現這樣的:

- (id)initWithName:(NSString *)name { 
    return [self initWithName:name breed:CatBreedTabby age:0]; 
} 

所以要改變一個子類的初始化行爲,你只需要改變指定初始化,你會得到別人的自由。

+0

感謝Chuck給予的回覆。我還有一個問題。當super初始化時,它是否創建了超類的對象,然後將其存儲在自我中? – 2013-04-10 23:46:04

+0

@DanielLee:不。'super'是一個等同於'self'的關鍵字,但運行該方法的超類版本而不是當前類。所以它只是在'self'上運​​行超類初始化器來設置從超類繼承的任何實例變量等。 – Chuck 2013-04-10 23:50:11

+0

謝謝查克。我知道我已經說過這是我的最後一個問題,但我認爲在我完全理解init之前我需要澄清一件事。初始化方法的真正含義是什麼?這是否意味着在分配類內存後,類對象被賦予「初始」(如初始化)值爲零?而且,什麼是自我?是自我的對象?你引用的實例變量是它們的實例變量,如* myFraction,它保存對數據的引用或存儲在對象中的分子?對不起,有很多問題。 – 2013-04-11 00:02:06

相關問題