作者:王泽豪
时间: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. JQuery中attr ,html,text,val,的一些用法

    attr:主要获取元素内部的属性,返回 的是属性值 html:返回当前元素(不包括他自己本身的标签,但是可以返回他自己的)的标签加上内容.仅限于返回第一个. text:和 .html() 方法不同, ...

  2. POJ1463 Strategic game (最小点覆盖 or 树dp)

    题目链接:http://poj.org/problem?id=1463 给你一棵树形图,问最少多少个点覆盖所有的边. 可以用树形dp做,任选一点,自底向上回溯更新. dp[i][0] 表示不选i点 覆 ...

  3. URAL 2068 Game of Nuts (博弈)

    题意:给定 n 堆石子,每次一个人把它们分成三堆都是奇数的,谁先不能分,谁输. 析:因为每堆都是奇数,那么最后肯定都是要分成1的,那么就把不是1的全加和,然后判断奇偶就OK了. 代码如下: #prag ...

  4. iOS单例 宏定义

    #define singleton_interface(className) \ + (className *)shared##className; // @implementation #defin ...

  5. android shape(如自定义Button)

    Shape 前言:有时候会去自己去画一些Button的样式来展现在UI当中,其中主要用到的就是Shape 先来看一段代码: <?xml version="1.0" encod ...

  6. Mathematics for Computer Graphics数学在计算机图形学中的应用 [转]

    最近严重感觉到数学知识的不足! http://bbs.gameres.com/showthread.asp?threadid=10509 [译]Mathematics for Computer Gra ...

  7. 8.实现(Realization)

    实现关系是用来描述接口和实现接口的类或者构建结构之间的关系,接口是操作的集合,而这些操作就用于规定类或者构建结构的一种服务. 在接口和类之间的实现关系中,类实现了接口,类中的操作实现了接口中所声明的操 ...

  8. github 多帐户使用

    同一台电脑有2个github账号?咋办 比如一个公司账号一个个人账号. 私人账号如下: 邮箱example@126.com 账号:example 公司工作账号如下: work@xx.com 账号:my ...

  9. EF TO MYSQL 无法查询中文的解决方法

    ef dbfirst 连接mysql 5.7版本 起初,连edmx都无法生成 报错 Entity : The value for column 'IsPrimaryKey' in table 'Tab ...

  10. 一个小巧的C++Log输出到文件类 (转)

      http://blog.csdn.net/dpsying/article/details/17122739 有时候需要输出一些程序运行的信息,供我们不需要调试就可以直接查看程序运行状态.所以我们需 ...