• KVC与KVO


    KVC:键值编码(Key-Value-Coding),是一个非正式的Protocol,提供一种机制间接访问对象的属性,是路径访问的规范;
    KVO:键值观察 (Key-Value-Observe),是基于KVC的一种观察者模式,观察者在键值改变的时候会得到通知,类似于代理,通知中心,它是一种通讯方式。
    使用KVC需注意:1.Key的值必须正确,如果错误会出现异常
            2.valueForUndefinedKey,当没有定义当前Key的值,这个方法会被调用
            3.因为类key反复嵌套,所以有个keyPath的概念,keyPath就是用.号来把一个一个key链接起来,这样就可以根据这
              个路径访问下去
    KVO实现三部曲:
      1.注册需要观察的对象的属性addObserver:forKeyPath:options:context:
          2.实现observeValueForKeyPath:ofObject:change:context:方法,这个方法当观察的属性变化时会自动调用
          3.取消注册观察removeObserver:forKeyPath:context:
     
    KVO与delegate的区别:
      和delegate一样,KVO和NSNotification的作用也是类与类之间的通信,与delegate不同的是:
      1)这两个都是负责发出通知,剩下的事情就不管了,所以没有返回值;
      2)delegate只是一对一,而这两个可以一对多。这两者也有各自的特点。
     
    delegate的优势:

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

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

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

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

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

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

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


    delegate的劣势:

    1.需要定义很多代码:

    • 协议定义;
    • controller的delegate属性;
    • 在delegate本身中实现delegate方法定义

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

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

  • 相关阅读:
    翻String.Format源码发现的新东西:StringBuilderCache
    禁止Asp.Net WebService 的Test页面功能
    利用XML序列化和Asp.Net Web缓存实现站点配置文件
    使用.NET配置文件appSettings元素的File属性
    <probing> 元素指定扩展Asp.Net加载程序集位置
    Windbg .net内存调试有用的命令(笔记 )
    The Dangers of the Large Object Heap(转载,LOH内存碎片情景重现)
    Advanced .NET Debugging: Managed Heap and Garbage Collection(转载,托管堆查内存碎片问题解决思路)
    调试.NET程序OutOfMemoryException (转载)
    mysql数据库之索引和分析索引
  • 原文地址:https://www.cnblogs.com/dududuzhaoji/p/5441279.html
Copyright © 2020-2023  润新知