回答
簡而言之:委託是兩個對象之間的一對一關係,允許在另一個對象上調用方法,並且它允許被調用者執行該方法的自定義實現。
委託可以讓你編寫自定義器件定製的方法實現。
例如UITableView's Delegate和datasource(這是作爲代表技術上相同)允許的UITableView讓其它類重要的任務,如建立細胞在的tableview顯示的和對事件作出響應(例如輕敲在tableview中的細胞)。
首先使用代表團,你需要定義一個協議:在類的頭文件的前面「<>」
@protocol protocolNameHere
- (void) sampleMethodHere;
@optional
- (void) implementingThisMethodIsOptional;
@end
那麼你要添加的協議的名稱,你想成爲代表。該班現在符合該協議。你需要在這個類中實現這個方法。
如果有多個代表,則用逗號分隔它們。
委託是將在未來的某個點響應預先選擇的選擇器(函數調用)的對象。
假設我使用類FancyAsynchronousURLGetter的對象異步加載一個URL(在後臺)。由於它在後臺運行,因此我希望能夠在加載url時執行其他操作,然後在準備就緒時收到通知。通過在FancyAsynchronousURLGetter上使用委託並編寫適當的代碼,我可以指定一個具有特定選擇器的對象,該選擇器將在FancyAsynchronousURLGetter完成時調用。事情是這樣的:
- (void)loadView
{
...
FancyAsynchronousURLGetter* getter = [[FancyAsynchronousURLGetter alloc] initWithURL:url];
[getter setDelegate:self];
/*
getter will call either
- (void)fancyAsynchronousURLGetterLoadSucceeded:(FancyAsynchronousURLGetter*)g
or
- (void)fancyAsynchronousURLGetterLoadFailed:(FancyAsynchronousURLGetter*)g
on its delegate, depending on whether load succeeded or failed
*/
[getter start];
...
}
- (void)fancyAsynchronousURLGetterLoadSucceeded:(FancyAsynchronousURLGetter*)g
{
NSLog(@"Load succeeded.");
}
- (void)fancyAsynchronousURLGetterLoadFailed:(FancyAsynchronousURLGetter*)g
{
NSLog(@"Load failed.");
}
,並在FancyAsynchronousURLGetter本身:
- (void)start
{
[self performSelectorInBackground:@selector(fetchURL) withObject:nil];
}
- (void))fetchURL
{
Fetch the URL synchronously
if (success)
[delegate fancyAsynchronousURLGetterLoadSucceeded:self]; // note: probably want to call this on the main thread
else
[delegate fancyAsynchronousURLGetterLoadFailed:self];
}
我會用(方法調用)替換(函數調用)。方法調用與直接調用函數不同。而你使用的方法名稱是不可能的。使其成爲一個委託方法,稱爲'fancyAsynchronousURLGetter:(id)sender succeeded:(BOOL)success'。 –
謝謝 - 更正(3年後!) – damian
這裏是一個示例代碼來了解。
協議定義
#import <Foundation/Foundation.h>
@protocol ProcessDataDelegate <NSObject>
@required
- (void) processSuccessful: (BOOL)success;
@end
@interface ClassWithProtocol : NSObject
{
id <ProcessDataDelegate> delegate;
}
@property (retain) id delegate;
-(void)startSomeProcess;
@end
協議執行
#import "ClassWithProtocol.h"
@implementation ClassWithProtocol
@synthesize delegate;
- (void)processComplete
{
[[self delegate] processSuccessful:YES];
}
-(void)startSomeProcess
{
[NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector: @selector(processComplete) userInfo:nil repeats:YES];
}
@end
要得到充分的思想,visit here...
代表不依賴於您使用的語言或平臺,它是一種設計模式。我建議你閱讀Delegation pattern瞭解基本知識。之後,我認爲你可以搜索更深入的瞭解。
- 1. iPhone SDK - 避免鑄造的委託
- 2. 已定義委託
- 3. 在iPhone中的WebView委託中處理404錯誤問題sdk
- 4. 定義事件委託
- 5. 兩個定義委託
- 6. Swift中的自定義委託方法
- 7. iphone-一個自定義的委託方法不被稱爲
- 8. 爲什麼在iPhone SDK 4.0中未調用CLLocationManager委託?
- 9. 在UIView/UIViewController關係中定義委託
- 10. Proble調用自定義委託方法
- 11. 不使用'numberOfRowsInSection'委託方法到達tableview的結尾iphone sdk
- 12. 無法找到協議聲明自定義協議委託iphone
- 13. Objective-C 10.10 NSApplication委託不能調用委託類中定義的方法
- 14. 訪問共享委託人的iPhone/iPad委託?
- 15. 需要「委託」的簡明定義
- 16. 自定義UIView的tableView委託方法
- 17. iphone檢測委託事件
- 18. NSURLConnection委託和線程 - iPhone
- 19. iphone進行個人委託
- 20. iPhone谷歌分析SDK委託和多個帳戶問題
- 21. iPhone SDK:我應該何時/何時發佈UITableView委託對象?
- 22. iOS:我很難與委託定義
- 23. 自定義UICollectionView數據源和委託
- 24. 自定義UITableViewCell委託其子視圖?
- 25. 自定義委託方法不呼叫
- 26. 自定義UIAlertView無委託回調?
- 27. IOS - respondsToSelector總是與自定義委託
- 28. IOS設置自定義委託
- 29. 自定義委託爲空iOS
- 30. SerialPort C#自定義DataReceived委託
看看[我的答案在這裏](http://stackoverflow.com/questions/7118598/what-is-the-difference-between-notifications-delegates-and-protocols/7118796#7118796)... – jtbandes