Men的博客

欢迎光临!

0%

KVC

它提供了一种使用字符串而不是访问器方法去访问一个对象实例变量的机制。
键值编码必需的方法在非正式协议NSKeyValueCoding中声明,
默认在NSObject中实现。

相关方法

-(id)  valueForKey: (NSString *) key
返回表示属性的键字符串所对应的值。如果不能取得值
,则将引起接收器调用方法valueForUndefinedKey:。
-(void)setValue: (id) value  forKey: (NSString*) key

访问过程

1.接收器中如果有key访问器
(或getKey、isKey、_key、_getKey、setKey)则使用它。
2.没有访问器时,使用接收器的类方法
accessInstanceVariablesDirectly来查询。返回YES时,如果存在实例
变量key(或_key、isKey、_isKey等)则返回或设置其值。使用引用计数管
理方式时,实例变量如果为对象,则旧值会被自动释放,新值被保存并代入。
+(BOOL)accessInstanceVariablesDirectly
通常定义为返回YES,可以在子类中改变。该类方法返回YES时,使用键值编码
可以访问该类的实例变量。返回NO时不可以访问。只要该方法返回YES,实例变
量的可视属性即使有@private修饰,也可以访问。
3.既没有访问器也没有实例变量时,将引起接收器调用方法
valueForUndefinedKey:或setValue:forUndefinedKey:。
-(id) valueForUndefinedKey: (NSStirng *) key
不能取得键字符串对应的值时,从方法valueForKey:中调用该方法。默认情
况下,该方法的执行会触发NSUndefinedKeyException。不过,通过在子类
中修改定义,就可以返回其他对象。
- (void) setValue:(id)value forUndefinedKey:(NSString *) key
不能设置键字符串key对应的属性值时,从方法setValue:forKey中调用该方
法。默认情况下,该方法的执行会触发异常NSUndefinedKeyException。不
过,通过在子类中修改定义,可以返回其他对象。
4.   如果该返回值不是对象,则返回被适当的对象包装的值;设置值时也应先
包装成相应的对象。
属性为对象时,该对象还可能持有属性。这时候可以用“.”连接表示键的字符
串,这种表示方式称为键路径。只要能找到对象,点和键多长都没有关系。
- (id)valueForKeyPath:(NSString *) keyPath
以点切分键路径,并使用第一个键向接收器发送valueForKey:方法。然后,
再使用键路径的下一个键,向得到的对象发送valueForKey:方法,如此反复
操作,返回最后获得的对象。
- (void)setValue:(id) value forKeyPath:(NSString *) keyPath
与valueForKeyPath:方法一样取出对象,这里只对路径中的最后一个键调用
setValue:forKey:方法,并设定属性值为value。

Other

KVC提供了验证Key对应的Value是否可用的方法:

(BOOL)validateValue:(inout id *)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;  

KVC对数值和结构体型属性的支持

NSMutableDictionary的setObject和setValue的区别,哪一个add nil对象会crash

1, setObject:forkey:中value是不能够为nil的,不然会报错。
setValue:forKey:中value能够为nil,但是当value为nil的时候,会自动调用removeObject:forKey方法
2, setValue:forKey:中key的参数只能够是NSString类型,而setObject:forKey:的可以是任何类型