看到一篇非常非常好的文章,讓你瞬間理解委託是啥。
在我們講到協議的時候,申明的協議都是預留方法體,方法的的具體實現,等待使用協議的人去實現。要實現oc中的委託功能,其中重要的的一個成員,就是協議。
網上有很多討論關於委託的概念,有人說委託是c中的的回呼函數,也有人說是java中的回呼函數,也有人說委託就是代理。個人認為,給宇宙中的某個物體下定義和取名字,最好不要偏離他真實的本質,如果定義偏離本質太遠,很容易誤導觀眾。如果實在想不出一個貼切的名字去定義某個物體,那麼我們可以不對某個物體下定義,我們可以直接說,“它是幹什麼用的”,這樣既然明了,又簡單。在此,我並不想討論委託是什麼,我也怕誤導大家,因這隻是我個人的定義而已。在生活中,我們經常聽到這樣的話,某人張小姐委託某人李先生去辦某件事,這樣也就夠了,你也只需要知道委託就是張先生代替張小姐去做某件事,至於他們倆之間如何協商的,我們不用管。在C中可以把某個方法指派給某個指標,因此C能很方便的實現委託的效果,但是,我們我不能把C中的回呼函數當成委託,C的回呼函數只是實現委託效果的一個工具而已。java中並沒有象C中的回呼函數,一般的做法就是通過介面等形式實作類別似類似C中的回呼函數的效果,所以以後不要說java中有回呼函數。記住,你只是實現了類似C中回呼函數的效果。在oc中,委託的效果也是通過協議實現的,大致流程是先定義某個協議,預留空的方法。先定義李先生類,在李先生類的內部包含協議,並調用協議申明的方法。定義張小姐類型,使張小姐類型遵循前面定義的協議,並在張小姐內部實現協議中的方法。在張小姐的內部執行個體化李先生,並把張小姐指派給李先生內部的協議,然後由李先生調用在張小姐內部實現的協議方法。
下面的例子是從網上找來的
A定義協議
//// NoteDelegate.h// IphoneDelete//// Created by wangjun on 10-9-18.// Copyright 2010 __MyCompanyName__. All rights reserved.// 定義協議#import <UIKit/UIKit.h>@protocol NoteDelegate//回呼函數-(void)messageCallBack:(NSString *)string;@end
B申明李先生
<span style="font-size: 10px;">//// ManagerMessage.h// IphoneDelete//// Created by wangjun on 10-9-18.// Copyright 2010 __MyCompanyName__. All rights reserved.//#import <Foundation/Foundation.h>#import "NoteDelegate.h"@interface ManagerMessage : NSObject { id<NoteDelegate> *noteDelegate;}@property (nonatomic,retain) id<NoteDelegate> *noteDelegate;-(void)startThread;@end
實現李先生
// ManagerMessage.m// IphoneDelete//// Created by wangjun on 10-9-18.// Copyright 2010 __MyCompanyName__. All rights reserved.//#import "ManagerMessage.h"@implementation ManagerMessage@synthesize noteDelegate;//開始一個線程 -(void)startThread{ [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(targetMethod:) userInfo:nil repeats:NO];}-(void)targetMethod:(NSString *)string{ if (self.noteDelegate!=nil) { //完成線程 調用回呼函數 [self.noteDelegate messageCallBack:@"回呼函數"]; }}@end
C申明張小姐,並使之遵循協議
//// IphoneDeleteViewController.h// IphoneDelete//// Created by wangjun on 10-9-18.// Copyright __MyCompanyName__ 2010. All rights reserved.//#import <UIKit/UIKit.h>#import "NoteDelegate.h"@interface IphoneDeleteViewController : UIViewController <NoteDelegate>{IBOutlet UITextField *textView;}@property (nonatomic,retain) UITextField *textView;@end
實現張小姐
// IphoneDeleteViewController.m// IphoneDelete//// Created by wangjun on 10-9-18.// Copyright __MyCompanyName__ 2010. All rights reserved.//#import "IphoneDeleteViewController.h"#import "ManagerMessage.h"@implementation IphoneDeleteViewController@synthesize textView;//回呼函數-(void)messageCallBack:(NSString *)string{ self.textView.text=string;}- (void)viewDidLoad { [super viewDidLoad]; self.textView.text=@"測試"; ManagerMessage *message=[[ManagerMessage alloc] init]; //通知調用協議 message.noteDelegate=self; [message startThread]; [message release];}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning];}- (void)viewDidUnload { self.textView=nil;}- (void)dealloc { [self.textView release]; [super dealloc];}@end
要實現委託效果,在oc中最要的是,你要遵循某個協議,然後把自己self指派給委託。
好了,文章看完了,我猜你已經有了一些概念與想法了,讓我來抽取出其中的關鍵區段: 協議:NoteDelegate看成C++中的抽象基類 主角:IPhoneDeleteViewController看成C++中的實作類別 託管(代理):ManagerMessage看成觀察者模式中的被關注的對象 現在,梳理一下流程 現實語義:張小姐家裡有一件事要處理,可她現在沒辦法去辦,她就告訴李先生(viewDidLoad發生),要李先生幫忙去辦 模式語義:觀察者IPhoneDeleteViewController先實現介面NoteDelegate內容,然後註冊興趣事件對象ManagerMessage,如果興趣事件發生則通知自己,註冊過程發生在viewDidLoad函數中。興趣事件發生後,依據多態特性,調用messageCallBack通知觀察者。 我的理解完了,不妥之處,還望指正。
原文:http://blog.csdn.net/ma52103231/article/details/7564314
by zxzhao