作者:王泽豪
时间: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. HDU 1241 Oil Deposits DFS(深度优先搜索) 和 BFS(广度优先搜索)

    Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  2. M站 滚动日历弹框

    先放张效果图: 完整Demo: <!DOCTYPE html> <html lang="en"> <head> <meta http-eq ...

  3. 快速排序详解以及java实现

    快速排序作为一种高效的排序算法被广泛应用,SUN的JDK中的Arrays.sort 方法用的就是快排. 快排采用了经典的分治思想(divide and conquer): Divide:选取一个基元X ...

  4. Linux下 如何正确配置 Nginx + PHP

    假设我们用PHP实现了一个前端控制器,或者直白点说就是统一入口:把PHP请求都发送到同一个文件上,然后在此文件里通过解析「REQUEST_URI」实现路由. 一般这样配置 此时很多教程会教大家这样配置 ...

  5. 你真的会玩SQL吗?实用函数方汇总

    http://www.cnblogs.com/zhangs1986/p/4917800.html 实用函数方法 由于有些知识很少被用到,但真需要用时却忘记了又焦头烂额的到处找. 现在将这些‘冷门“却有 ...

  6. JSP+Servlet+JavaBean

    MVC是三个单词的缩写:M,Model(模型):V,View( 视图 ),C,Control(控制). MVC模式的目的就是实现Web系统的职能分工, Model层:实现系统的业务逻辑,即javaBe ...

  7. 系列文章--SharePoint 开发教程

    SharePoint 2013 图文开发系列之入门教程 学习地址:http://www.cnblogs.com/jianyus/p/3461719.html 里面有2007.2010.2013各个版本 ...

  8. Keil MDK AGDI Drivers, ULink, JLink, ST-Link, NuLink, JTAGjet

    AGDI Drivers AGDI is an Application Program Interface (API) third-party developers can use to create ...

  9. Android Recovery Ui 分析

    Android  recovery和android本质上是两个独立的rootfs, 仅仅是recovery这个rootfs存在的意义就是为android这个rootfs服务,因此被解释为Android ...

  10. 惊叹jQuery(解决jQuery对象到DOM的转换)

    jQuery是一个javascript框架,但绝对不是通常意义上的一些包装,个人感觉是一个改变js控制方式的框架.我们可以像美工通过写css分离页面代码一样,通过jQuery来分离页面与效果..下面转 ...