iOS开发:delegate、notification、KVO的选择

发布时间:2017-04-15 17:03 来源:互联网 当前栏目:电脑编程入门

   delegate、notification和KVO的功能比较类似,那么在实际的编程中,如何选择这些方式呢?

  在开发ios应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers间怎么进行通信。在IOS应用不断的出现三种模式来实现这种通信:

  1.委托delegation;

  2.通知中心Notification Center;

  3.键值观察key value observing,KVO

  因此,那为什么我们需要这些模式以及什么时候用它以及什么时候不用它。

  下面完全根据我的开发经验来讨论这三中模式。我将讨论为什么我觉得某种模式要好于另外一种模式以及为什么我觉得在一定的环境下某中模式比较好。我给出的这 些原因并不是圣经,而仅仅是个人观点。如果你有什么不同的观点或者还可以进行补充的地方,可以联系我,一起讨论。

  上面的三种模式是什么?

  三种模式都是一个对象传递事件给另外一个对象,并且不要他们有耦合。三种模式都是对象来通知某个事件发生了的方法,或者更准确的说,是允许其他的对象收到 这种事件的方法。这对于一个对象来说,是非常普通而且必须做的任务,因为没有通信,controllers将不能整合到整个应用中。controller 的另外一个目的是尽可能的自包含。我们希望controllers以自己的方式存在,在controllers层面上不能与其他的controllers 进行耦合。Controllers能够穿件其他的controllers而且他们之间可以自由通信,但是我们不希望controller又回接到创建自己 的controller。如果我们耦合了他们,那么我们将不能复用他们,以及完全失去对应用中一个独立的组件的控制。

  这三种模式给controllers(也可以是其他的对象)提供通信的方法。下面将描述如何在ios应用中使用这些模式,同样需要注意的他们在其他的地方也会用到,并且确实是存在。

  delegation

  当我们第一次编写ios应用时,我们注意到不断的在使用“delegate”,并且贯穿于整个SDK。delegation模式不是IOS特有的模式,而是依赖与你过去拥有的编程背景。针对它的优势以及为什么经常使用到,这种模式可能不是很明显的。

  delegation的基本特征是,一个controller定义了一个协议(即一系列的方法定义)。该协议描述了一个delegate对象为了能够响应 一个controller的事件而必须做的事情。协议就是delegator说,“如果你想作为我的delegate,那么你就必须实现这些方法”。实现 这些方法就是允许controller在它的delegate能够调用这些方法,而它的delegate知道什么时候调用哪种方法。delegate可以 是任何一种对象类型,因此controller不会与某种对象进行耦合,但是当该对象尝试告诉委托事情时,该对象能确定delegate将响应。

  delegate的优势:

  1.非常严格的语法。所有将听到的事件必须是在delegate协议中有清晰的定义。

  2.如果delegate中的一个方法没有实现那么就会出现编译警告/错误

  3.协议必须在controller的作用域范围内定义

  4.在一个应用中的控制流程是可跟踪的并且是可识别的;

  5.在一个控制器中可以定义定义多个不同的协议,每个协议有不同的delegates

  6.没有第三方对象要求保持/监视通信过程。

  7.能够接收调用的协议方法的返回值。这意味着delegate能够提供反馈信息给controller

  缺点:

  1.需要定义很多代码:1.协议定义;2.controller的delegate属性;3.在delegate本身中实现delegate方法定义

  2.在释放代理对象时,需要小心的将delegate改为nil。一旦设定失败,那么调用释放对象的方法将会出现内存crash

  3.在一个controller中有多个delegate对象,并且delegate是遵守同一个协议,但还是很难告诉多个对象同一个事件,不过有可能。

  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、
  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、