2010-07-06 29 views

回答

5

代表是設計模式使用面向對象的語言,它允許對象「調用」未知代碼來執行該對象本身無法有效執行的活動或計算。比方說,你有一個類犬:

@protocol DogDelegate; 

@interface Dog : Wolf <Domesticated> 
- (void)bark; 
- (void)tiltHeadAdorably; 

- (void)playWithToy: (Toy *)aToy; 
@property (readonly) Toy *favoriteChewToy; 

@property (readwrite, assign) id <DogDelegate> delegate; // "DELEGATE" PROPERTY DECLARED HERE 
@end 

的委託對象通常是通過實例化Dog,並通過該實例呼籲做的事情,狗本身不能做的代碼的形式提供。例如,考慮DogDelegate協議的這個接口,它定義什麼Dog的委託對象有望做:

@protocol DogDelegate <NSObject> 
@required - (void)letDogOut: (Dog *)aDog; 
@required - (void)letDogIn: (Dog *)aDog; 
@optional - (void)scratchDog: (Dog *)aDog forTimeInterval: (NSTimeInterval)duration; 
@end 

在這種情況下,DogDelegate實例往往是Dog的所有者(和,在Objective-C中,代表通常擁有一個對象,所以這與隱喻良好地排成一行。)狗,當它需要出去...狗的活動...將要求它的代表執行-letDogOut:方法,把狗放在後院。完成後,它會要求其代表執行-letDogIn:方法,將狗帶回內部。當狗想要親情,如果代表能夠,它會要求代表使用-scratchDog:forTimeInterval:來劃傷它一段時間。

+0

謝謝你的回覆。這是非常詳細和有用的。我能意識到它是一個班級的控制嗎? – Questions 2010-07-06 02:45:05

+0

我不確定你的意思是「控制一個班級」。如果你的意思是「我可以自己創建委託,並寫下它的代碼嗎?」那麼是的 - 這就是他們的目的。如果你的意思是「我可以選擇哪個對象是另一個對象的委託?」,那麼是的,並且默認情況下對象不具有*委託集,所以你必須*做到這一點。如果你的意思是「一個委託可以是'UIControl/NSControl'的一個實例嗎?」那麼是的,再次,儘管Apple的類通常不會爲其他類實現委託方法。 – 2010-07-06 02:49:20

+0

非常感謝。我現在有了更好的理解。 – Questions 2010-07-06 02:55:03

-2

委託是控制整個應用程序的對象。它顯示了主窗口,並會告訴應用程序在啓動和關閉時該執行什麼操作。它基本上是你的應用程序的指揮中心。使用它的最好方法是調用其他控制器來顯示一些NIBS。 iPhone應用程序中的委託實際上沒有任何特殊之處,但有一些特殊的方法被調用。

+0

感謝您的回覆。我想問一下'NIBS'是什麼? – Questions 2010-07-06 02:40:22

+0

您正在考慮應用程序委託,它是特定對象的特定委託,但不是委託的最終和全部;它們遍及Cocoa和各種其他Objective-C框架。 (Nibs是.NIB文件;來自Interface Builder的接口文件。) – 2010-07-06 02:42:06

+0

NIB是一個擴展名爲xib的文件,它們是您的應用程序的視圖。 @jonathon - 他在iPhone應用程序中要求回合代表... – 2010-07-06 02:43:00

3

代表是蘋果公司大量採用的設計模式。簡而言之,將其想象爲「我負責處理......」。其中......是通知,事件,協議等。例如,您的AppDelegate負責處理您的App設置,顯示和啓動。

請記住我過於簡化它。但我相信如果你需要的話,有人可以提供更詳細的答案。

0

委託與JS中的回調函數(例外情況是委託是類型安全的)是一回事。例如,如果您在JS中執行Ajax,則聲明一個回調函數,以便在Ajax調用完成。以同樣的方式,您將聲明一個委託函數來調用,例如,當歌曲選擇對話框關閉時。