作者:王泽豪
时间:2016年4月22日
 
      ★代理是一种设计模式,它的价值在于通过一个统一的模式,解决一个原本并不方便、甚至是几乎不可能解决的问题。
 
      ★代理有两个关注点:协议和代理属性
             协议定义了一个或多个方法,由某一个类负责实现。协议中有两个关键字@required和@optional,默认是@required;@required是必须实现的方法,@optional的方法不一定要实现.
             代理属性作为某个类的一个属性,通常是另一个类的实例对象,可以负责完成原来这个类不方便或者无法完成的任务。代理属性类似于一个普通属性,但跟普通属性不同的是,它的类型是id,这令它具备一个明显的优势:允许不同的类成为本类的代理.
 
      ★使用代理的基本步骤:
            1. 制定协议(定义方法)
            2. 设置代理属性
            3. 在需要代理做事情时,让代理执行协议方法(注意:先判断,再执行,防止崩溃)
            4. 设置代理
            5. 遵守协议
            6. 实现协议方法
 
      ★注意:
             代理执行协议方法时要使用 respondsToSelector检查其代理是否符合协议(检查对象能否响应指定的消息),以避免代理在回调时因为没有实现方法而造成程序崩溃
            
      ★协议可用定义在单独.h文件中,也可用定义在某个类中
             1.  如果这个协议只用在某个类中,应该把协议定义在该类中
             2. 如果这个协议用在很多类中,就应该定义在单独文件中
             分类可用定义在单独.h和.m文件中,也可用定义在原来类中
 
      ★代理的其它优点:让程序耦合度更低,结构感更强  
 
      ★代理的内存管理: 为什么我们设置代理属性都使用weak呢?
             我们定义的指针默认都是__strong类型的,而属性本质上也是一个成员变量和set、get方法构成的,_strong类型的指针会造成强引用,而造成循环引用的关键是A.B两个类,在B类中使用代理向A类传值,那么B就会用self.delegate 调用协议方法,委托方delegate属性强引用代理对象,把值传给A,而在A类中设置代理对象的时候,代理方强引用创建的B类创建的对象,这样就造成了循环应用.
  
      ★代理的使用场景:
            1. 当一个类无法完成某些功能需要通过另一个类来完成或者当一个类需要另一个类的某些值但无法直接获取时;例如: 一个View有几个按钮,每个按钮的tag值不同,我需要在点击按钮时弹出提示窗,提示窗中要显示被点击按钮的tag.显然用一个View是无法直接显示提示窗的,但我可以在一个控制器中显示提示窗,而控制器并不知道我点击的哪一个按钮;这时就可以使用代理,让控制器去执行View想要实现的功能,并把需要的值传递给控制器(代码详见网易彩票幸运大转盘)
            2. A控制器跳转到B控制器时,B控制器获取到了A控制器的某些值(顺传),可以通过属性传递;B控制器返回A控制器时,B控制器需要将某些值返回给A控制器(逆传),这时没法通过属性进行传值,可以使用代理(代码详见微信通讯录或第二次考试编程题)
    
     ★代理与block 通知的异同:
            相同点: 都可以在逆向传值时使用
            不同点: delegate是个对象,然后通过一个对象自己调用代理协议来完成整个流程,代理更加面向过程;block是传递一个指针,利用指针执行来进行回调,使用block时要注意循环引用的问题,block更加面向结果;通知更多的是用在层级跨度大或两个不相关联的类的传值,通知可以多对一,使用通知要注意cell的循环引用问题
 
      ★上面只是介绍了下代理的简单实用,如果想要更加深入的了解代理,可以参考下面这篇文章:
 

IOS之代理的更多相关文章

  1. iOS 设置代理过程

    iOS设置代理的过程 (以模拟 button 作用为例) 1.写协议 新建一个名为 MyButton 的文件,继承于 UIView,在该文件里 声明协议 myDelegate 2.写协议方法 为声明的 ...

  2. iOS设计模式 - 代理

    iOS设计模式 - 代理 原理图 说明 1. 代理模式大家都用过,但用抽象基类NSProxy实现代理估计鲜有人用 2. 本人用NSProxy实现了代理模式,对于理解消息转发机制有点帮助 源码 http ...

  3. ios透明代理抓包

    之前接到一些ios测试的时候,一些应用往往由于这样那样的原因(比如自实现的发包函数)导致直接使用本地ios系统的代理很难将数据代理到主机的burp或findler中,本文提供了一种解决该问题的途径 原 ...

  4. iOS开发-代理模式

    代理模式有的时候也被称之为委托模式,但是实际上两者是有分别的,代理模式为另一个对象提供一个替身或占位符访问这个对象,代理对象和控制访问对象属于同一类,委托对象和对象不一定属于同一类.两者都可以控制类的 ...

  5. iOS delegate, 代理/委托与协议.

    之前知知道iOS协议怎么写, 以为真的跟特么java接口一样, 后来发现完全不是. 首先, 说说应用场景, 就是当你要用一个程序类, 或者说逻辑类, 去控制一个storyboard里面的label, ...

  6. ios delegate 代理模式 观察者模式 不同视图间的通信

    delegate,在ios中比比皆是,NSURLConnection(网络请求有),tableView, connectionView,等系统自带 的常见代理.甚至,自己写代码的时候,随意间敲打出了p ...

  7. IOS设计模式--代理 (委托)

    原文 http://blog.csdn.net/lovefqing/article/details/8270111 委托(delegate)也叫代理是iOS开发中常用的设计模式.我们借助于protoc ...

  8. ios手势识别代理

    之前做优质派时写了个仿网易新闻导航的第三方,由于当时做项目时这个主控制器就是RootViewController,虽然用的是ScrollView但也没考虑到导航栏的手势返回的问题 ,现在做小区宝3.0 ...

  9. 【iOS】代理传值与块代码传值

    主线程与子线程常常须要进行数据的传递.不同的类之间,不同的控制器之间都须要. 并且常常须要监听一个动作的完毕.而后才去做对应事件. (代理是一对一的关系). 一.代理传值 代理是一种设计模式. iOS ...

随机推荐

  1. SqlAgent备份脚本

    ) ) set @dbname='emcp' set @back_path= 'e:\'+@dbname+'\'+@dbname ),) )) )) )) +'.bak' exec('use ['+@ ...

  2. 用vagrant搭建一个自己的lnmp环境(一)

    用vagrant搭建自己的lnmp环境 1.工具: a.vagrant b.virtual box c.linux服务器box(此处我使用centos 7.0) 2.安装完vagrant和virtua ...

  3. Ajax.ActionLink与Ajax.BeginForm使用场所的思考

    Ajax.ActionLink使用在提交参数明确的情况下,如: Ajax.ActionLink("加入购物车", "AddToCart", "Cart ...

  4. PLSQL中便捷的输入

    我们可以利用PLSQL工具中的替换功能进行sql语句的输入,具体做法如下: 工具---首选项---用户界面---编辑器 1. 然后点击“edit”按钮: 2. . 在文本框中输入你想要替换的字符,等号 ...

  5. java懒汉式单例遇到多线程

    单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功 ...

  6. xshell linux传文件

    yum  install lrzsz 安装完毕即可使用 rz,sz是便是Linux/Unix同Windows进行ZModem文件传输的命令行工具 windows端需要支持ZModem的telnet/s ...

  7. github命令

    git push origin master //把本地源码库push到Github上 git pull origin master //从Github上pull到本地源码库

  8. 理解Web标准(网站标准)

    我觉得一名Web前端应该好好理解Web标准到底是什么,为什么要在我们的实际实践中遵循Web标准. 什么是Web标准.百度百科的解释是: WEB标准不是某一个标准,而是一系列标准的集合.网页主要由三部分 ...

  9. Ajax 无刷新在注册用户名时的应用的代码

    var xmlHttp; uName() //用户名失去焦点时 { if(all.uname.=="") { all.l1.innerHTML="不能为空!"; ...

  10. Codeforces Round #335 (Div. 2) D. Lazy Student 构造

    D. Lazy Student Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/606/probl ...