2013-04-12 53 views
5

每個視圖類都有多個init方法 - 其中一些已經作爲UIView的一部分包含在其中,然後是附加的 - 並且每個視圖類都以相同的方式設置相同的元素。因此,我通常都會運行一個[self initialSetup];方法,其中包括設置所有這些元素。最好的方式來執行init而不重複代碼?

我遇到的問題是,如果一個子類也有一個initialSetup方法,它會覆蓋超類initialSetup方法,因此超類將不得不讓方法公開爲了仍然功能。這會導致組織方面的問題,因爲該方法不應該從init以外被調用,所以沒有理由公開。

回答

2

您偶然發現了一個問題,即有對沒有完美的修復命中。理想情況下,你所需要的是一種不能在正常意義上被分類的方法,只有那種類型的類才能被訪問。

在哪裏,這是一個風險,通常的做法似乎是整合類名進入設置方法。所以,而不是initialSetup你會有類似myViewSubclassInitialSetup

你也可以在你的方法頂部添加這樣的事情:

NSAssert([self isMemberOfClass:[ThisClass class]], 
      @"IniitalSetup called by sub- or superclass") 

那麼你的調試版本,如果一個子類或超結束調用你的init方法將引發異常。這會給你一個斷點和堆棧跟蹤的位置,它可以讓你很快找到問題。

它不會將任何代碼添加到您的發佈版本。

2

initialSetup的名稱更改爲類似initialSetupClassName - 子類,即使它們意外地使用了相同的模式,也不會使用與它們具有不同的類名稱相同的名稱。

你也可以使用一個你不願意被稱爲私有方法「_」前綴,但subclasser可以做到這一點也。

1

不幸的是Objective C沒有提供一種方式來實現,在一個「乾淨」的方式。理想的解決方案將是一種受保護的方法。但這是不可能的Objective C

蘋果有這個問題,當他們在創建UIGestureRecognizer。有些方法他們真的不想被某人調用,但必須被子類覆蓋。他們選擇處理這個問題的方式是創建一個單獨的頭文件(UIGestureRecognizerSubclass.h),該文件包含原始UIGestureRecognizer的類別以及那些「受保護的」方法。附加頭只能由子類導入(即爲了子類的目的)。有關詳細信息,請參閱UIGestureRecognizer Class Reference

當然,這並不妨礙任何人濫用額外的頭文件,但至少它明確說明你的意圖,並保持你的代碼結構良好。當你使用這個類時,你也不會因其他方法的自動完成而「困擾」它。

就個人而言,我只使用一個額外的標題,如果非常重要的是沒有人直接調用它。在大多數情況下,我認爲可以使用公共方法並記錄它的意圖。 iOS框架也有很多這樣的情況。 F.E.很多方法的UIViewControllerviewDidLoad

2

這聽起來像你缺少一個指定的初始化。指定一個初始化程序作爲實際執行設置的官方程序,並讓所有其他程序只調用一些程度的定製程序。通常指定的初始值將是最詳細的 - 例如,如果您有init,initWithName:,initWithName:age:initAsFiveYearOldNamed:,則指定的初始化程序將爲initWithName:age:,其他初始化程序只會調用該方法,並填充相應的參數。

相關問題