作者:王泽豪
时间: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. windows服务安装及卸载

    1)安装脚本Install.bat%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe JobSchedule.exeNet ...

  2. datatable把一个LIst的数据放入两个colum防止窜行的做法

    DataColumn objectOne = new DataColumn("objectOne", typeof(object)); dt.Columns.Add(objectO ...

  3. Lotus 迁移到Exchange POC 之 新建2007 服务器!

    我们登录到Exchange 2007 服务器,由于需要对AD进行扩展,我们首先必须完成架构扩展,由于默认没有ldifde工具,所以我们需要执行servermanagercmd –I rsat-adds ...

  4. drop,truncate与delete的区别

    注意:这里说的delete是指不带where子句的delete语句 相同点 truncate和不带where子句的delete, 以及drop都会删除表内的数据 不同点: 1. truncate和 d ...

  5. InnoDB存储引擎

    [InnoDB和MyISAM区别][ http://jeck2046.blog.51cto.com/184478/90499] InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型, ...

  6. Xcode快捷键整理

    下面是Xcode比较常用的快捷键,特别是红色标注的,很常用.用熟了开发编辑代码的的时候就很方便,希望对大家有用~1. 文件CMD + N: 新文件CMD + SHIFT + N: 新项目CMD + O ...

  7. C++的优秀特性1:引用

    (转载请注明原创于潘多拉盒子) 一本典型的C语言教科书的厚度大约是200页左右,而一本典型的C++教科书的厚度至少要500页.比如K&R的<The C Programming Langu ...

  8. state与status的区别

    status 指人时暗指相对的地位,指物时相当于 situation.situation 较狭义地指由环境综合决定的特定时间上的状态或情形. state 人或物存在或所处的状态,和 condition ...

  9. PL/pgSQL函数带output参数例子

    例子1,不带returns : [postgres@cnrd56 bin]$ ./psql psql () Type "help" for help. postgres=# CRE ...

  10. javascript计算字符串的字节长度

    String.prototype.byteLen = function(){ var len = 0, i = this.length; while(i--) { len += (this.charC ...