2010-03-10 30 views
5

創建和初始化對象的兩種方法之一是否更好?Objective C - 創建和初始化對象的首選方法

MyClass oClass = [[MyClass alloc] init]; 
oClass.length = 5; 
oClass.text = @"Hello"; 

或使用包含大約相同的代碼,但看起來像這樣一類方法:

MyClass oClass = [MyClass myClassWithLength:(int) 5 andText:(NSString *) @"Hello"]; 

我討厭它,當我看到的東西做的方法不止一種,我不知道,如果一個是比其他更好,或者爲什麼!

+0

你的意思是[MyClass myClassWithLength:...? – Ross 2010-03-10 15:11:29

+2

從來沒有一個類方法被稱爲'initWith ...' - init方法總是實例方法。它將始終是'[[MyClass alloc] initWith ...]'。不過,類有時會提供便利的構造函數,就像羅斯在問的那樣。只是要清楚。 – Chuck 2010-03-10 16:03:23

回答

8

不要成爲仇敵。 :-)

順便說一句,我假設你的意思是:

編輯:去除不必要的管型)

MyClass oClass = [[MyClass alloc] initWithLength:5 andText:@"Hello"]; 

之所以多的init ...方法是使開發人員更方便地創建正確初始化的實例。因此,例如,如果您發現開發人員經常需要創建帶有長度和文本的MyClass實例,則可以通過提供允許他們一步完成該操作的API來讓他們的生活更輕鬆。如果您發現開發人員還經常需要使用文本字符串創建MyClass的實例,那麼您也可以提供一個-initWithText:方法。

如果產生這樣的情況下,經常被用作臨時對象(即不存儲在實例變量或靜態變量),你還可以添加一個類方便的方法像+myClassWithText:返回與初始化的MyClass的自動釋放實例提供的文本字符串

至於哪一個更好:它總是最好儘可能完全初始化的對象,因此,如果對象需要進行正確的初始化這兩個值,使用允許您提供兩個參數的方法。如果您不需要存儲對正在創建的實例的引用,請使用類便捷方法,以便您的代碼不必處理內存管理。

+0

好點。但似乎代碼示例應該看起來像MyClass oClass = [[MyClass alloc] initWithLength:5和Text:@「Hello」];在相應參數前沒有(int)和(NSString *)... – Wildcat 2010-03-10 22:09:31

2

如果對象是沒有長度和文本不可用,那麼第二個選項可能會更好。如果這些字段是可選的,那麼第一個字段更好。

但是,我不認爲這個問題是絕對真實的。

+1

爲了方便起見,通常一個類將提供兩種替代方案(因此需要在類實現中使用「指定的初始化方法」)。 – 2010-03-10 15:18:34

0

如果你有很多屬性是不太可能初始化它們都在一行代碼的類。這兩種方式對我來說都很好。

+0

沒有理由假設屬性和初始值之間的一對一映射,尤其是考慮到+ alloc保證所有實例變量(isa除外)都被初始化爲零,對於許多屬性來說這是一個合理的默認值。但是在大量初始值實際有用的情況下,可以考慮實現-initWithDictionary:方法。 – jlehr 2010-03-10 16:17:15

0

如果initWithSomething:方法是可行的,並要爲這些屬性提供初始值,我總是喜歡它,只是因爲它的簡單。即使對於一個類的不可變版本,它也會一直工作。

但是init方法本質上都不是「更好」。類通常有一個或兩個指定的初始值設定項,所有其他值只是調用具有默認值的值 - 它不一定會保持實例的屬性不變。一個類的文檔應該說明它的初始化器是做什麼的,哪一個是這個類的指定初始化器。例如,[[NSDate alloc] init]使用NSDate的指定初始化程序initWithTimeIntervalSinceReferenceDate:來創建表示當前日期和時間的日期對象。

順便說一句,這也意味着,當你繼承一個類時,你只需要覆蓋其指定初始化。由於其他人只是稱呼他們,他們會免費獲得新的行爲。