Objective-C Delegate

來源:互聯網
上載者:User

看到一篇非常非常好的文章,讓你瞬間理解委託是啥。

在我們講到協議的時候,申明的協議都是預留方法體,方法的的具體實現,等待使用協議的人去實現。要實現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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.