怎么自己在Objective-C中创建代理

首先我们要先创建一个类,为了方便理解我们就模拟现实生活中的找中介租房子,因此先创建一个Person类

1.在Person.h中定义代理的协议,并完成代理方法声明:代码如下

 1 // Person.h文件
 2 
 3 #import <Foundation/Foundation.h>
 4 
 5 @class Person;
 6 
 7 //1 定义代理的协议
 8 @protocol PersonDelegate <NSObject>
 9 
10 // 可选方法
11 @optional
12 - (void)personFindHouse:(Person *)person;
13 // 必要方法
14 @required
15 
16 @end
17 
18 @interface Person : NSObject
19 
20 @end

注:代理协议中可选方法可实现可不实现,但必要方法必须实现

2、定义代理属性:代码如下

 1 // Person.h文件
 2  
 3 #import <Foundation/Foundation.h>
 4 @class Person;
 5 //1 定义代理的协议
 6 @protocol PersonDelegate <NSObject>
 7 // 可选方法
 8 @optional
 9 - (void)personFindHouse:(Person *)person;
10 // 必要方法
11 @required
12 
13 @end
14  
15 @interface Person : NSObject
16 @property (nonatomic,copy) NSString *name;
17 //2 定义代理属性
18 @property (nonatomic,weak) id<PersonDelegate> delegate;
19 - (void)zuFang;
20 @end

3、调用代理的方法(通知) 给代理发送消息:代码如下

 1 // Person.m文件
 2 #import "Person.h"
 3 
 4 @implementation Person
 5 - (void)zuFang
 6 {
 7     NSLog(@"%@--要租房",self.name);
 8     
 9     //3 调用代理的方法(通知) 给代理发送消息
10     if([self.delegate respondsToSelector:@selector(personFindHouse:)])
11     {
12         [self.delegate personFindHouse:self];
13 
14     }
15 }
16 @end

上面代码第10行是判断这个对象是否实现了personFindHouse:这个方法

好现在我们需要定义一个ZhongJie类来使用这个代理

1、让这个类遵守代理协议:代码如下

1 // ZhongJie.h文件
2 #import <Foundation/Foundation.h>
3 #import "Person.h"
4 
5 @interface ZhongJie : NSObject <PersonDelegate>
6 
7 @end

2、实现代理方法:代码如下

 1 // ZhongJie.m文件
 2 #import "ZhongJie.h"
 3 
 4 @implementation ZhongJie
 5 
 6 - (void)personFindHouse:(Person *)person
 7 {
 8     NSLog(@"找到房子了 ");
 9 }
10 
11 @end

3、设置代理属性:代码如下

 1 // ViewController.m 文件
 2 #import "ViewController.h"
 3 #import "Person.h"
 4 #import "ZhongJie.h"
 5 @interface ViewController ()
 6 
 7 @end
 8 
 9 @implementation ViewController
10 
11 - (void)viewDidLoad {
12     [super viewDidLoad];
13     // Do any additional setup after loading the view, typically from a nib.
14     ZhongJie *zj = [[ZhongJie alloc] init];
15     
16     Person *p = [[Person alloc] init];
17     
18     p.name = @"someOne";
19     //3 设置代理属性
20     p.delegate = zj;
21     
22     [p zuFang];
23     
24 }
25 
26 
27 @end

 

这样我们就创建了代理,并让一个对象使用了这个代理

 

posted @ 2015-07-12 10:31  Melody_Zhy  阅读(848)  评论(0编辑  收藏  举报