標籤

2012年4月14日 星期六

Objective-C中的委托(delegation)用法与讲解

http://blog.csdn.net/dream_it_life/article/details/5362232
    第一次接触到委托是在学习《大话设计模式》的时候碰到的,我是一名Javaer,那本书是.Net的,里面提到了委托这个概念,并且有相应的用法与支持,当时觉得挺奇怪,怎么Java中没有遇到过呢?后来才知道,Java没有明确的相应支持,感觉委托很像依赖,聚合,代理,事件监听,所以很长一段时间没有去真正的搞明白它,以为这些就是委托,今天学习到Objective-C中的委托的时候,才发现这些不是,仔细的研究再加上与Java相结合最后自己得出了委托的定义,虽然很像之前说的那些方式,但还是有一定的区别:



1)雇主与委托者共同参与一个处理,说白了就是调用雇主方法的时候在雇主的方法内不但有相应的逻辑处理,还得请求委托者的方法共同处理
2)请求委托者的方法时要将自己传递过去,也就是说把自己当作一个入参传递过去,当然也可以有不同的实现,只是委托者能获得雇主就可以
就这两点,一下子就区分了其它的概念,像却不是,但是Java中有一个技术确实是完全的委托的应用,就是事件监听,记不记得Swing的ActionListener,所以搞明白这个,委托是怎么回事也就清楚了,当然这里就不说了,自己思考,下面是我写的一个简单的委托在Objective-C中的小Demo,事先说明,一般情况下要运行反射才算是真正的一个委托,而不应该像我写的例子一样硬编码固定的类,我只是为了说明一下委托,而且,不怕大家见笑,我还不会Objective-C的动态反射,Java的委托例子网上多的是,我也就i不写Java的了,只是一起明白一下委托的概念及具体的应用的好了,代码如下:
#import <Cocoa/Cocoa.h>


/**
 *委托的Demo
 *
 *@author 王硕
 **/

//委托类,委托类没有任何方法声明,它只需实现非正规协议的中需要的方法
@interface DemoDelegate : NSObject

@end //DemoDelegate

//雇主类
@interface Demo : NSObject {
//委托类
DemoDelegate *demoDelegate;
}

-(void) setDemoDelegate : (DemoDelegate *) delegate;

-(void) sendMessage;

@end //Demo

//NSObject的WSDelegate类别,定义非正规协议
@interface NSObject (WSDelegate)

-(void) setDemoDelegate : (DemoDelegate *) delegate;

-(void) handlerDelegate : (Demo *) demo;

@end //WSDelegate

@implementation Demo

-(void) setDemoDelegate : (DemoDelegate *) delegate {
[delegate retain];
[demoDelegate release];
demoDelegate = delegate;
}

//通知委托类方法执行
-(void) sendMessage {
[demoDelegate handlerDelegate : self];
}

-(void) dealloc {
[demoDelegate release];
[super dealloc];
}

@end //Demo

@implementation DemoDelegate

//相应的委托方法
-(void) handlerDelegate : (Demo *) demo {
NSLog(@"%@", demo);
}

@end //DemoDelegate

int main (int argc, char *argv[]) {

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Demo *demo = [[Demo alloc] init];
DemoDelegate *delegate = [[DemoDelegate alloc] init];
[demo setDemoDelegate : delegate];
[demo sendMessage];
[pool release];

return (0);

}

当然,上面的代码注释没有写的特别详细,因为相信如果你在学习Objective-C的委托,那么你一定掌握了Objective-C的基本知识,上面的代码是很简单的,你肯定可以看的懂,这些都是我综合资料之后总结的概念,如果哪里有不对的地方还希望和大家多交流,希望对大家有帮助.

沒有留言:

張貼留言