Delegate、Notification 和 KVO

Delegate

优点:
  • 语法严格, 所有将要听到的事件必须在delegate 协议中有清晰的定义
  • delegate 中任一方法未实现就会出现错误
  • 协议必须在 controller 的作用域范围内定义
  • 没有第三方对象要求监视通信过程
  • 在一个控制器中可以定义多个不同的协议, 每个协议有不同的 delegates
  • 能够接受调用的协议方法的返回值
缺点:
  • 代码量大 : 1.协议定义 2. controller 的 delegate 属性 3.在 delegate 本身中实现 delegate 方法定义
  • 释放代理对象时, 要将delegate 改为 nil, 否则调用释放对象的方法会 crash

Notification

优点:
  • 代码量少, 实现简单
  • 1 对多方式实现简单
  • controller 能够传递 context 对象 (字典), 可以携带自定义消息
缺点:
  • 编译时不会检查通知是否能被观察者正确处理
  • 释放注册的对象时, 需要在通知中心取消取消注册
  • 调试时难以追踪
  • controller 和观察者需要提前知道通知名称 UserInfodictionary keys, 如果这些没有在工作区间定义 ,可能会出现不同步的情况
  • 通知发出后, controller 不能从观察者过得任何反馈信息

KVO

优点:
  • 能够提供一种简单的方法实现两个对象间的同步
  • 能够对非我们创建的对象, 即内部对象的状态改变做出响应, 而且不需要改变内部对象的实现
  • 能够提供观察的属性的最新值以及先前值
  • 用key paths 来观察属性, 因此可以观察嵌套对象
  • 不需要额外代码来允许观察值能被观察
缺点:
  • 观察的属性必须使用 string 来定义, 因此编译器不会出现警告
  • 对属性重构将导致我们的观察代码不再可用
  • 释放观察者时需要移除观察者

你可能感兴趣的:(Delegate、Notification 和 KVO)