iOS开发--KVC&KVO

     KVC和KVO这两个词看起来很唬人的样子,很多人一开始接触的时候都不知道这是什么鬼,而且掌握了后又容易忘。所以在这里简单做个笔记,以备不时之需。下面分别介绍一下KVC和KVO的使用方法。

1.KVC

    KVC是Key-Value Coding的缩写,是键值编码的意思,它是一种可以直接通过字符串的名字(key)来访问类属性(实例变量)的机制。主要、、常用的是setValue:forKey:以及setValue:forKeyPath:这两个方法。

   (1)先来看下setValue:forKey:的用法。建一个测试类Person,头文件里有个年龄属性age。

   示例1: 在基类里我们可以直接通过setter方法或者setValue:forKey:方法对Person里的age成员赋值。 

   运行结果如下:  

   示例2:我们也可通过getter方法或者valueForKey:方法来获取变量的值.  

   运行结果如下: 

   示例3:对于Person里的私有成员属性,我们只能通过setValue:forKey:和valueForKey:方法来进行赋值和获取。

   譬如在Person.m文件里声明一个name属性。   

   然后我们对其进行赋值或获值。  

   运行结果如下: 

   (2)再来看下setValue:forKeyPath:的用法。这是通过键路径来给变量赋值,可以简单理解为给类的成员的成员赋值。

        譬如说,我们在上面的基础上再建一个类Address,里面有一个address的成员属性,然后在Preson里面声明。  

     示例1.给Person的Address成员里的address属性进行赋值。  

     运行结果如下: 

     示例2:通过getter或者valueForKeyPath:获取address的值。  

     运行结果如下: 

     对于私有成员属性,情况和上面类似,就不做过多赘述。

     注:当通过key来访问类成员属性的时候,会查找这个类里与key相匹配的实例变量(_key, key, _isKey, isKey)。比如说下面这句代码:  会匹配_name、name、_isName、isName这四个实例变量,当同时存在时,优先级为:_name>_isName>name>isName;当这四个实例变量都不存在时,通过valueForKey:或者valueForKeyPath: 这两个方法获取变量程序会报错。      

     这里对于KVC的简单介绍就完结了,如果需要了解setValue:forKey方法的实现原理,可以参考这篇文章:http://www.jianshu.com/p/d54af904967b

 

2.KVO

     KVO是Key-Value Observing的缩写,翻译为键值观察,是一种监听机制,当指定的对象的属性被修改后,则观察者就会接受到通知。

     KVO的使用步骤:给对象添加指定路径的观察者,设置观察者的监听回调,移除观察者

     (1)在上面的基础上,设置Person为观察者,观察其成员addr的address属性的变化。 

     (2)重写回调方法,输出addr的address属性改变前后的值。 

     (3)移除观察者

      然后我们改变两次addr的address属性。  

      运行结果如下:  

       这样KVO的简单流程就完成了。

你可能感兴趣的:(iOS开发--KVC&KVO)