1.代理初识
假设BOSS需要买电脑 让worker去买
这时boss需要一个代理即为worker 去买电脑
BOSS创建一个协议 协议中的方法为买电脑
BOSS有一个属性 属性的类为遵守协议的类
BOSS有一个成员方法 方法的实现为 代理去买电脑
worker类需要遵守协议 实现协议方法 买电脑
代码实现如下

1 #import <Foundation/Foundation.h>
2 #import "Boss.h"
3 #import "Worker.h"
4
5 int main(int argc, const char * argv[]) {
6 @autoreleasepool {
7
8 Boss * boss = [[Boss alloc] init];
9 Worker * worker = [[Worker alloc] init];
10 [boss setDelegate:worker];
11 [boss delegateBuyMacbook];
12
13 }
14 return 0;
15 }

1 #import <Foundation/Foundation.h>
2
3 //创建协议
4 @protocol BossDelegate <NSObject>
5
6 - (void)buyMacbook;
7
8 @end
9
10
11 @interface Boss : NSObject
12 //有一个遵守协议的代理
13 @property (nonatomic,weak) id<BossDelegate> delegate;
14 //方法调用代理去买电脑
15 - (void)delegateBuyMacbook;
16 @end

1 #import "Boss.h"
2
3 @implementation Boss
4 - (void)delegateBuyMacbook {
5 NSLog(@"老板开始找人买电脑");
6 [_delegate buyMacbook];
7 }
8 @end

1 #import <Foundation/Foundation.h>
2 #import "Boss.h"
3 @interface Worker : NSObject<BossDelegate>
4
5 @end

1 #import "Worker.h"
2
3 @implementation Worker
4 - (void)buyMacbook {
5 NSLog(@"买了60台Macbook Pro 15 高配");
6 }
7 @end
2.代理回调
/*
//当我们需要完成某个功能模块,但不知道使用功能模块的是哪个对象,通过协议,可以规定接收数据的对象通过哪个方法获得数据。调用该方法的过程称为【回调】
*/

1 #import <Foundation/Foundation.h> 2 #import "LRCManager.h" 3 int main(int argc, const char * argv[]) { 4 @autoreleasepool { 5 // Download *d = [Download new]; 6 LRCManager * lrcManager = [[LRCManager alloc] init]; 7 // lrcManager.download = d; 8 // d = nil; 9 // 10 // Download __weak * download = [Download new]; 11 // 12 // NSLog(@"%@",lrcManager.download); 13 [lrcManager run]; 14 } 15 return 0; 16 }

1 #import <Foundation/Foundation.h> 2 #import "Download.h" 3 /* 4 //当我们需要完成某个功能模块,但不知道使用功能模块的是哪个对象,通过协议,可以规定接收数据的对象通过哪个方法获得数据。调用该方法的过程称为【回调】 5 */ 6 @interface LRCManager : NSObject<DownloadDelegate> 7 @property (nonatomic,weak) Download * download; 8 @property (nonatomic,strong) NSString * lrcContent; 9 - (void)run; 10 + (void)test; 11 @end

1 #import "LRCManager.h" 2 3 @implementation LRCManager 4 5 + (void)test { 6 LRCManager * lrcManager = [[LRCManager alloc] init]; 7 [lrcManager run]; 8 } 9 10 - (void)run { 11 Download * download = [[Download alloc] init]; 12 download.delegate = self; 13 [download downloadWithURLPath:@"www.baidu.com"]; 14 } 15 16 - (void)downloadFinished:(NSString *)str { 17 NSLog(@"%@",str); 18 } 19 20 - (void)dealloc { 21 NSLog(@"lrcManager dealloc"); 22 } 23 @end

1 #import <Foundation/Foundation.h> 2 3 @protocol DownloadDelegate <NSObject> 4 5 - (void)downloadFinished:(NSString *)str; 6 7 @end 8 9 @interface Download : NSObject 10 @property (nonatomic,weak) id<DownloadDelegate> delegate; 11 - (void)downloadWithURLPath:(NSString *)path; 12 @end

1 #import "Download.h" 2 3 @implementation Download 4 - (void)downloadWithURLPath:(NSString *)path { 5 int i = 0; 6 while (i++ < 5) { 7 printf("下载中 "); 8 sleep(1); 9 } 10 NSString * lrcStr= @"我是下载到的字符串"; 11 [_delegate downloadFinished:lrcStr]; 12 } 13 14 - (void)dealloc { 15 NSLog(@"download dealloc"); 16 } 17 @end
3.双向代理
Boss需要个代理去工作
Worker需要代理发工资