OC代理

代理模式是一种消息传递方式, 一个完整的代理包括:委托对象,代理对象和协议.

a. 协议:用来指定代理双方可以做什么, 必须做什么

b. 委托对象:根据协议指定代理对象需要完成的事, 即调用协议中的方法.

c. 代理对象:根据协议实现委托对象需要完成的事, 即实现协议中的方法.

代理属性使用weak

a. 原因:我们在UITableViewController中, 控制器的view就是UITableView, 这就相当于UITableViewController强引用着UITableView(代理对象).

而当我们设置delegate的时候, 一般都是让UITableViewController成为代理, 这个时候如果代理也使用strong, 就会导致循环引用, 因此代理得用weak.

b. 为什么不用assign

weak和assign是一种"非拥有关系"的指针, 通过这两种修饰符修饰的指针变量都不会改变被引用对象的引用计数. 但是在一个对象被释放后, weak会自动将指针置nil, 而assign不会. 在OC中, 向nil发送消息是不会导致崩溃的, 而assign会导致野指针错误 unrecognized selector sent to instance

代理与block对比

a. 有多个消息传递时, 用delegate实现更合适, 更清晰. block就比较臃肿, 别扭.

b. 从设计模式的角度来说, 代理更加面向过程, block则更加面向结果.

c. 性能上来说, block性能消耗略大于delegate, 因为block涉及到栈区向堆区拷贝等操作, 时间和空间上的消耗都大于代理. 而代理只是定义了一个方法列表, 在遵守协议的对象的objc_protocol_list中添加一个节点, 在运行时向遵守协议的对象发送消息即刻.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 响应链(事件的传递、事件的响应) 事件的传递:从上往下,父传子;事件的响应:从下往上,子传父; 代理和Block的...
    oc123阅读 4,334评论 0 1
  • 文中的问题多收集整理自网络,不保证100%准确,还望斟酌采纳。 1、怎样防止指针的越界使用问题? 答案: 1 .防...
    江河_ios阅读 3,138评论 0 0
  • 1.属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作...
    曾令伟阅读 4,692评论 0 10
  • 1.内存管理 2.单例的理解 3.post和get的区别 4.md5和base64是什么,有什么区别 5.简单谈谈...
    coder_Wg阅读 5,037评论 1 6
  • 一.OC的三大特性 封装、继承、多态 1> 什么是多态 多态:不同对象以自己的方式响应相同的消息的能力叫做多态。 ...
    蓝心儿的蓝色之旅阅读 5,265评论 0 2