KVC,即Key-Value-Coding,键值编码。一个非正式的 Protocol,提供一种机制来间接访问对象的属性。
最基本的两个方法:
setValue: 属性值 forKey:属性名:
valueForKey:属性名:
举个栗子
声明一个有name,age属性的User类
[user setValue:@"孙悟空" forKey:@"name"];
[user setValue:@"[NSNumber numberWithInt]" forKey:@"age"];
[user valueForKey: @"name"];
[user valueForKey:@"age"];
在KVC编程中,无论调用这两个哪个方法,都是通过NSString对象来指定被操作属性的。
底层机制都是:
(1)程序优先考虑调用“setName:属性值”(valueForKey)代码,通过setter(getter)方法完成设置。
(2)如果没有setName:方法,KVC机制会搜索该类名为_name的成员变量,无论该成员变量是在类接口部分定义,还是在实现部分定义,也无论用哪个访问控制符修饰,这条KVC代码底层实际都是对_name成员变量的赋值。
(3)如果既没有setName:的方法,也没有定义_name成员变量,KVC机制会继续搜索该类名为name的成员变量,无论该成员变量是在类接口部分定义,还是在实现部分定义,也无论用哪个访问控制符修饰,底层是对name成员变量的赋值。
(4)如果还没找到,系统就会执行该对象的setValue:forUndefinedKey:方法。
而这个方法需要重写,否则会导致程序异常结束。
同理,valueForKey:@“name”方法机制如上。