2011-05-13 41 views
2

任何人都可以區分我們何時使用授權而不是類別,反之亦然。我清楚這一點。分類下的代理團隊

感謝

+0

那麼,這些東西只有遠親關係。我建議你發佈一些代碼,這會給你帶來這種困惑,我很樂意提供幫助! – 2011-05-13 05:44:54

+0

我作爲面試問題得到了這個。所以我只是想知道。 – pa12 2011-05-13 05:56:19

回答

5

類別允許一個類添加新的方法或覆蓋現有的方法,因而允許擴展類沒有子分類。添加方法是最有用的目標,如果您不確切知道正在擴展的類是什麼,則覆蓋會變得非常錯誤。

它更多的是一種語言特徵而不是模式,它適用於每個類。

委託是一種模式不是語言功能,應該使用的類必須編碼它,否則它將無法工作。

通常一個委託將被要求實現一個由接收委託的類已知的協議。然後該類將使用委託來完成它編碼的內容,其中一些最常見的情況是使用策略模式的一部分發送通知,即在某些代碼部分中根據具體委託的實現情況提出問題讓委託執行一個動作或它們的任意組合。

例如UIApplicationDelegate是通知(application:didFinishLaunchingWithOptions:)和動作(application:openURL:sourceApplication:annotation:)協議,UITextFieldDelegate是通知(textFieldDidBeginEditing:)和策略(textField:shouldChangeCharactersInRange:replacementString:)。

其實我可以想象在上述所有這些情況下使用類別實施委託:發送通知,執行操作,參與策略。但它會要求你非常非常好地知道擴展類正在做什麼,可能需要它的代碼,否則你可以很容易地破壞類或被更改的類實現中斷。所以這個用法在我看來是非常錯誤的。

-3

分類,當你需要擴展類,而無需創建一個子類,例如,當你需要一個名爲ISURL方法添加到NSString的,您可以利用類別如下的使用,在這裏我們不創建一個子類,相反,我們正在擴展實現。

@interface NSString (Utilities) 
- (BOOL) isURL; 
@end 

委託類似於回調函數,

1

類別:將方法添加到現有的

委託:允許一些其他的對象,委託,參與對象的動作下的另一對象:修改行爲。

假設你有一個包含三個表的iOS應用程序。即使它們的配置方式相同,但如果這些表具有不同的代表,則每個表的行爲可能會有所不同。

你不能這樣做,因爲一個類別同樣適用於它擴展的類的所有實例。另一方面,如果你想擴展UITableView類來添加一些新的功能,你需要一個類別*。代表是特定於實例的,並且僅限於委派類的設計者爲其設計的角色。

*或一個子類,當然。