当我们学习控件的时候!我们发现很多控件本身都有自己的委托!当我们把一些方法封转起来的时候 通过委托能更好的处理数据或者事件!我们知道苹果推崇的MVC开发模式,委托常常用来处理模型和图形之间数据的传递。例如我们通过http 请求服务器时!我们通常会把http处理数据封装在一个模型里!我们可以通过委托来传递请求完的数据!这样增强的代码的耦合度和复用率!
自定义委托本身遵循一个自己规定的协议!让定义好的方法来遵循我们的协议!
下面用过一个 简单的传值来看看他们的机制!
通常,一个delegate的使用过程,需要经过五步:
1. 创建一个 delegate;
2. 委托者声明一个delegate;
3. 委托者调用delegate内的方法(method);
4. 被委托者设置delegate,以便被委托者调用;
5. 被委托者实现Delegate 所定义的方法。
掉用 delegate 后 最后一定要在-(void)dealloc 把当前的的委托置空 nil;不然的话当我们请求数据的时候由于网络的原因没有请求完 而退出当前界面导致程序崩溃!
声明的时候最好用assign,保证delegate整个生命进程都可以调用!避免引用计数为0 导致程序cras!
@property (assign,nonatomic) id<httpDelegate> delegate; //声明一个delegate
我们在A类里调用B类的delegate 来获取数据
/B类//
#import
@protocol httpDelegate <NSObject>//定义一个协议来实现委托的方法
//@optional 表明,这个方法是不要求一定实现,是可选的。
@optional
-(void)host:(NSString *)hostString port:(NSString *)portString;//delegate 定义的方法
@end
@interface HttpNetWork : NSObject
{
NSString *hoststring;
NSString *portstring;
id<httpDelegate> delegate;
}
@property (assign,nonatomic)id<httpDelegate> delegate;//声明一个delegate
-(void)gethostingAndportsting;
@end
#import "HttpNetWork.h"
@implementation HttpNetWork
@synthesize delegate = _delegate;
-(id)init
{
if (self = [superinit])
{
hoststring =@"192.168.11.00";
portstring =@"0000";
}
return self;
}
-(void)gethostingAndportsting
{
[ [selfdelegate ] host:hoststringport:portstring];
}
/A类//
- (void)viewDidLoad
{
[superviewDidLoad];
http = [[HttpNetWorkalloc]init];
http.delegate =self;
[http gethostingAndportsting];
}
// B类里delegate实现的方法
-(void)host:(NSString *)hostString port:(NSString *)portString
{
NSString *host = [hostString copy];
NSString *port = [portString copy];
_hostLabel.text = host;
_portLabel.text = port;
}
-(void)dealloc
{
http.delegate =nil;
}
demo 下载地址 http://download.csdn.net/detail/lengshengren/6505519