標籤:

第16條:提供 全能初始化方法

第16條:提供 全能初始化方法

所有對象均要初始化。在初始化時,有些對象可能無須開發者體統額外信息,不過一般來說還是要提供的。通常情況下,對象不知道必要的信息,則無法完成其工作。一iOS的UI框架UIKit為例,其中有個類叫做UITableViewCell,初始化該類對象時,需要指明其樣式及標識符,標識符能夠區分不同類型的單元格。由於這種對象的創建成本較高,所以繪製表格時可依照標識符來複用,一提升效率。我們把這種可為對象提供必要信息以便完成工作的初始化方法叫做全能初始化方法。

如果創建類實例的方式不止一種,那麼這個類就會有多和初始化方法,這當然很好,不過讓然要在其中選定一個做為全能初始化方法,令其他初始化方法都來調用它,NSDate就是個例子,其初始化方法如下:

- (instancetype)init NS_DESIGNATED_INITIALIZER;- (instancetype)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti NS_DESIGNATED_INITIALIZER;- (instancetype)initWithTimeIntervalSinceNow:(NSTimeInterval)secs;- (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)secs;- (instancetype)initWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)date;

正如所說那樣,在上面幾個初始化方法中 "initWithTimeIntervalSinceReferenceDate:"是全能初始化方法,也就是說其餘的初始化方法都要調用它。於是,只有在全能初始化方法中,才會存儲內部數據。這樣的話,當底層數據存儲機制改變時,只需修改此方法的代碼就好,無須改動其他初始化的方法。

要點

  • 在類中提供一個全能初始化方法,並於文檔里指明。其他初始化方法均應條用此方法。
  • 若全能初始化方法與超類不同,則需覆寫超類中的對應方法。
  • 如果超類的胡實話方法不適用於子類,那麼應該覆寫這個超類方法,並在起中拋出異常

推薦閱讀:

有什麼熬夜刷題工作保持精神的方法?
GTA5有什麼又快又多的賺錢方法?
如何能夠在白紙上把字寫整齊?
作業寫不完,又覺得抄很愧疚,怎麼辦?
國際註冊漢語老師教學技巧分享之語音篇

TAG:方法 |