作者:王泽豪
时间: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. Spring Boot 所提供的配置优先级顺序

    按照优先级从高到低的顺序,具体的列表如下所示. 命令行参数. 通过 System.getProperties() 获取的 Java 系统参数. 操作系统环境变量. 从 java:comp/env 得到 ...

  2. oracle 的行级触发器

    create or replace trigger tri_insertAcceptList after insert on STDOC.DEVELOPER for each row DECLARE ...

  3. 做 fzu oj 1106 题目学到的

    题目如下 这道题的意识就是给一个数问是否可以又阶乘之和构成,而难点主要是在于如果是7的话就是1!+3!,并不是单纯的从1的阶乘开始加,而是没顺序的,所以这题就得用到递归. (大概就是函数自己调用函数自 ...

  4. ImageSwitcher的应用

    在android的开发中很多时候都会用到图片的切换,我相信大家在安装完apk后,都会遇到弹出用户向导,介绍本版本apk的新功能,如果你用的是平板电脑或手机的话,可以左右滑动以切换视图,如果你用的是an ...

  5. iOS的几种定时器

    //gcd的定时器timer必须先保存为一个属性或者成员变量 @property (nonatomic , assign) dispatch_source_t timer; //第一种 每一秒执行一次 ...

  6. Mysql自增字段

    1.关键字 auto_increment 2.自增用法 例: CREATE TABLE animals ( id mediumint not null auto_increment, name cha ...

  7. Odoo的Domain (一)

    Odoo 的Domain:多个条件的列表. 条件:(字段名,操作符,值)三元式(列表或者元组) 字段名:当前模型的字段或者是通过点操作符访问的Many2one/Many2Many对象,当是Many2M ...

  8. (剑指Offer)面试题34:丑数

    题目: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 思路: 1. ...

  9. 解决 Cocos2d-x 中 Android.mk 手动添加源文件

    转自:http://blog.csdn.net/ypfsoul/article/details/8909178 Makefile Android.mk 引发的思索 在我们编写 Android 平台 c ...

  10. NAT类型与穿透 及 STUN TURN 协议

    STUN : Simple Traversal of User Datagram Protocol [UDP] Through Network Address Translators [NATs] S ...