最近一直在研究KVC,所以和大家分享一下心得吧。KVC,即键值编码,它提供了一种通过使用属性的名称来间接访问对象属性的方法。我们使用KVC时用到的最多的两个方法如下:

这两个方法可以在接收消息对象没有实现所访问的属性setter和getter方法的情况下,依然为该属性进行赋值和取值操作,私有变量也是如此。
我们可以定义一个类:
.h文件如下:

.m文件如下:

然后我们随便在一个控制器的view did load里对这个类进行初始化:

运行结果如下:

接下来我们再看下运用KVC能否对类的私有变量进行取值赋值操作:

普通的赋值方式编译都通不过:

我们换用KVC方式访问如下:

运行结果如下:

也就是说,OC里面并没有真正的私有变量,只要知道变量名称就可以访问并且操作这个变量。
说到这里,还有一个方法setValue:ForKeyPath:,可以通过键路径来操作属性内部的变量


运行结果如下:

总结:
KVC是所有的NSObject都具有的特性,利用KVC我们可以为一个类填充很多的属性,当目标类调用setValue:forKey:赋值时,如果目标类里没有这个key,为了防止程序崩溃,我们需要手动实现setValue:(id)value forUndefinedKey:(NSString*)key和valueForUndefinedKey:(NSString*)key这两个方法,用一个字典去接收value,同理,取值时用valueForUndefinedKey:(NSString*)key,根据key从字典取相应的value值。
网友评论