A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 愿我能 中级黑马   /  2014-4-18 10:24  /  1418 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 愿我能 于 2014-4-18 15:33 编辑

代理可以帮你做一些琐碎的事情,如视频中讲到的代理买票,可应用的时候总感觉摸不到头脑,就像是你与代理之间到底该定义一个什么样的协议,变量该如何在其中传送,求解惑 代理如何使用?

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

3 个回复

倒序浏览
说一说我的理解吧:
1,首先是:基本用途:协议可以用来声明一大堆方法(不能声明成员变量);只要某个类遵守了这个协议,就相当于拥有了这个协议宏的所有方法声明;只要父类遵守了某个协议,就相当于子类也遵守了。
格式:
  1. //1,协议的编写
  2. @protocol 协议名称
  3. //方法列表
  4. @end
复制代码

2,定义变量时指定遵守协议:
格式:
  1. /*
  2. 类名<协议名称> *变量名
  3. id<协议名称> 变量名
  4. */
  5. NSObject<MyProtocol> *obj;
  6. id<MyProtocol> obj2;
复制代码

使用:
  1. //@property (nonatomic, strong) 类名<协议名称> *属性名;
  2. @property (nonatomic, strong) Dog<MyProtocol> *dog;
  3. // @property (nonatomic, strong) id<协议名称> 属性名;
  4. @property (nonatomic, strong) id<MyProtocol> dog2;
复制代码


3,协议的应用--代理设计模式
<1>设计原理
自己不想亲自去做的事情,可以找人帮忙做,这就是代理。
<2>设计思路
(1)明白代理会做的事情,即代理的属性
(2)明白代理要去做的事情,即代理的方法
(3)换个代理后,自身不受到影响。
<3>实现方案
(1)定义一个协议protocol,在其中声明一些和代理沟通的方法
(2)拥有一个代理属性,也就是代理的功能
(3)让代理遵守定义的协议protocol

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
当某个方法你不能或不想直接去执行(比如买票),你可以在本类中添加一个 (id)<MyProtocol> delegate 的代理属性(成员变量),用delegate指向代理对象(代理类可以不唯一,但代理对象都需要遵守 MyProtocol 协议),这样就可以不依赖于固定的代理类(降低耦合性,减少代码量)
  1. @property (nonatomic, retain) id<MyProtocol> delegate;



  2. Person *p = [[[Person alloc] init] autorelease];

  3. Agent *a =  [[[Agent alloc] init] autorelease];

  4. p.delegate = a;

  5. [p buyTicket];



  6. NextAgent *a1 = [[[NextAgent alloc] init] autorelease];

  7. p.delegate = a1;

  8. [p buyTicket];
复制代码

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
悟中生有 发表于 2014-4-18 10:47
说一说我的理解吧:
1,首先是:基本用途:协议可以用来声明一大堆方法(不能声明成员变量);只要某个类遵 ...

谢谢 明白了一些
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马