KVC的全称是Key Value Coding,即键值编码,由NSKeyValueCoding协议提供支持,最基本操作属性的方法有以下两个
//setValue为属性值 forKey为属性名(指定属性设置值)
[person setValue:@"孙悟空" forKey:@"name"];
//valueForKey为属性名(获取指定属性的值)
[person valueForKey:@"name"];
setValue: forKey:的执行机制
[person setValue:@"孙悟空" forKey:@"name"];
1.会优先调用setName:方法,通过setter方法完成设置。
2.如果该类没有setName:方法,那么KVC该类中会搜索名字为_name的成员变量,无论_name是在类接口部分或实现部分定义,KVC都会对_name进行赋值。
3.如果以上两个都没有,那么KVC会搜索该类中名为name的成员变量,无论name是在类接口部分或实现部分定义,KVC都会对name进行赋值。
4.如果以上都没找到,系统会执行该对象的setValue:forUndefinedKey:方法。
valueForKey:的执行机制
[person valueForKey:@"name"];
1.会优先调用name:方法,通过getter方法的返回值。
2.如果该类没有setName:方法,那么KVC该类中会搜索名字为_name的成员变量,无论_name是在类接口部分或实现部分定义,KVC都会对_name进行赋值。
3.如果以上两个都没有,那么KVC会搜索该类中名为name的成员变量,无论name是在类接口部分或实现部分定义,KVC都会对name进行赋值。
4.如果以上都没找到,系统会执行该对象的valueForUndefinedKey:方法。
注意:setValue:forUndefinedKey:和valueForUndefinedKey:方法实现就是引发一个异常,这个异常将会导致程序应为异常结束,如果需要避免这种情况,需要在类中重写这两个方法即可。
key路径
KVC除了可操作对象的属性之外,还可以操作对象的复合属性,复合属性是指,比如,Person对象包含了一个Man类型的man属性,而Man对象又包含了name属性,那么KVC可以通过man.name这种key路径来操作Person对象的man属性的name属性。
[person setValue:@"孙悟空" forKey:@"man.name"];
[person valueForKey:@"man .name"];
KVC和setter、getter方法比较
其实用KVC操作对象属性的性能比通过setter和getter方法操作的性能更差,使用KVC的优势在于灵活,适用于提炼一些通用的代码。