3、代理模式

一、描述

  为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

二、种类

1、虚拟代理:根据需要,创建重型对象。
2、保护代理:根据各种访问权限控制对原对象的访问
3、智能引用代理:通过对真正对象的引用进行计数来管理内存,也用于锁定真正对象,让其他对象不能对其进行修改。

三、何时使用代理

1、当一个类的某些功能很难实现时需要别人来实现,但是不明确是什么功能,又不明确由谁来实现的时候。
2、需要一个远程代理的时候。
3、需要一个虚拟代理的时候。
4、需要一个智能引用代理的时候。

四、优点

1、耦合度低、结构感强

五、使用注意事项

1、设计代理时需要将代理对象传递出去
2、设置代理属性的时候为了避免循环引用不能用strong,要设置成week。
3、在写代理方法时应该指定方法是可选类型(@optional)还是必须实现类型(@required)
4、让代理执行某个方法的时候,需要判断这个代理对象存不存在以及这个代理能不能响应这个方法。

六、代理和协议的区别

1、都是使用@protocol来声明并提供方法的功能。
2、代理是作为降低耦合度,让中介帮自己实现自己实现不了的功能。
3、协议是作为约束对象、筛选对象,并规范接口的一个功能。

七、实际应用-侧边栏

 

八、NSProxy与代理模式

1、NSProxy简介
  NSProxy 是一个虚基类,用于其他对象的替身或为尚不存在的对象的替身定义的一套API。一般的,发送给代理的消息被转发给一个真实的对象或者本身替换的对象,
创建一个延迟实例对象开销是非常大的。NSProxy实现了包括NSObject协议在内基类所需的基础方法,但是作为一个虚拟的基类并没有提供初始化的方法
它接收到任何自己没有定义的方法他都会产生一个异常,所以一个实际的子类必须提供一个初始化方法或者创建方法,并且重载forwardInvocation:方法和
methodSignatureForSelector:方法来处理自己没有实现的消息。一个子类的forwardInvocation:实现应该采取所有措施来处理invocation,比如转发网络消息,
或者加载一个真实的对象,并把invocation转发给他。methodSignatureForSelector:需要为给定消息提供参数类型信息,子类的实现应该有能力决定他应该转发消息的参数类型,
并构造相对应的NSMethodSignature对象。

2、NSProxy的消息传递机制
https://github.com/nicklockwood/iCarousel

3、使用NSProxy实现代理模式


 

posted @ 2016-03-25 17:42  ios20  阅读(163)  评论(0编辑  收藏  举报