iOS.KVC.setValue:forKey:

Foundation Framework 定义了 NSObject(NSKeyValueCoding),

- (void)setValue:(id)value forKey:(NSString *)key;

该接口的说明

1. 先在message receiver的class中搜索方法 -set<Key>:

2. 如果1中未找到,则在class中以此搜索 _<key>, _is<key>, <key>, is<Key> 实例变量

3. 如果2中未找到,则调用方法 -setValue:forUndefinedKey:, 而该方法默认的实现是抛出

异常 NSUndefinedKeyException

接下来问题来,那么在iOS SDK中那么多framework,那么多的class,那么哪些class覆盖了NSObject

对-setValue:forUndefinedKey:的默认实现呢?

1 IMP animationImp = [CAAnimation instanceMethodForSelector:@selector(setValue:forUndefinedKey:)];
2
3 IMP defaultImp = [NSObject instanceMethodForSelector:@selector(setValue:forUndefinedKey:)];
4
5 IMP viewImp = [UIView instanceMethodForSelector:@selector(setValue:forUndefinedKey:)];
6
7 NSLog(@"defaultImp: %p, animationImp: %p, viewImp: %p", defaultImp, animationImp, viewImp);

log的输出为:defaultImp: 0x125dc84, animationImp: 0x10d5ca, viewImp: 0x125dc84

可见UIView并没有覆盖NSObject的默认实现,即一个class和NSObject 类 对以下调用的返回值一致

instanceMethodForSelector:@selector(setValue:forUndefinedKey:) 

所以在使用 -setValue:forKey:时需要用try-catch 来wrap对这个方法的调用。

时间: 2024-10-10 12:31:12

iOS.KVC.setValue:forKey:的相关文章

iOS KVC/KVO总结

http://www.cnblogs.com/QM80/p/3647819.html 如果要修改对象的属性值 1.一般情况下是直接利用对象属性的set方法来修改: Student *stu = [[Student alloc] init]; // set方法的两种书写格式 [stu setAge:10]; stu.age = 10; 2.但是如果不知道对象类型呢?那么就可以运用KVC键值编码(Key Value Coding) 间接的修改对象属性 KVC实现方式是:使用字符串来描述对象需要修改的

iOS KVC/KVO/KVB

看了那么多博客.描述那么复杂,其实KVC很简单,没描述的那么复杂,所以写一篇简单的易于理解的博文,切入正文: 1.KVC底层是通过runtime对method和value操作  比如说如下的一行KVC的代码: [sit setValue:@"sitename" forKey:@"name"]; 就会被编译器处理成: SEL sel = sel_get_uid ("setValue:forKey:"); IMP method = objc_msg_

setValue: forKey: 和 setValue: forKeyPath:

一. 先说下setObject forKey 和 setValue forKey 1.setObject:ForKey: 是NSMutableDictionary特有的:setValue:ForKey:是KVC的主要方法:2.setObject:ForKey:中object对象不能为nil,不然会报错:key的参数只要是对象就可以,并局限于 NSString:                                                                     

iOS KVC 概述

KVC KVC 的基本概念 -–>What KVC 是一种间接更改对象状态(或者说是属性值)的方式:key-value coding 简称 KVC. 主要本质特点是采用字符串来标识对象的属性变量,并可以利用这个标识来更改对象的状态(或者说是属性值) 这种间接表现在通过字符串来标识属性,?而不是通过调?用存取?方法或直接地访问实例变量的方式. KVC机制不仅?支持对象,还?支持标量和结构体类型,这些?非对象的类型会被?自动的装箱和开箱. Key & Key Path 键(Key)是?一个字符串

setObject:forKey和setValue:forKey的区别

setObject:forKey: 是NSMutableDictionary类的方法                              key参数类型可以是任意类型对象                              value不能为nil,不然会报错 setValue:forKey: 是NSObject类的方法也就是说所有的OC对象都有这个方法                            key值必须是字符串                            v

iOS kvc

kvc在我的脑海里就是一个用来来修改实例变量属性的值. 今天又遇到kvc来第二次学习它,网上看了很多博客,好像都不太符合我的口味,下面来摘录一些,自己总结一下: http://www.cnblogs.com/stoic/archive/2012/07/20/2601315.html 这个博主写的是一些应用实例,我比较喜欢,他说明了,如何去代码操作: http://blog.csdn.net/omegayy/article/details/7381301 这个博主是主要的原理: 下面是自己感觉有用

IOS [转]setValue和setObject的区别

在使用NSMutableDictionary的时候经常会使用setValue forKey与setObject forKey,他们经常是可以交互使用的,代码中经常每一种的使用都有. 1,先看看setValue: forKey:的定义 @interface NSMutableDictionary(NSKeyValueCoding) /* Send -setObject:forKey: to the receiver, unless the value is nil, in which case s

iOS KVC 和 KVO 区别简单总结

KVC: key value coding,键值编码.是一种通过使用属性的名称(key)来间接访问对象属性的方法.这个方法可以不用通过 setter/getter 方法来访问对象的属性.该方法使用的实质是,是使用 valueForKey来代替 getter 方法, setValueForKey 来代替 setter 方法. KVC 常用的方法: - (id)ValueForKey:   通过 key 值读取对象的属性 -(id)setValue: forKey: 通过 key 的值来使用属性 -

iOS KVC详细讲解

iOS KVC详细讲解 什么是KVC? KVC即NSKeyValueCoding,就是键-值编码的意思.一个非正式的 Protocol,是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制. 以上就是KVC的理论,面试时,如实回答就可以啦! 使用KVC说明 KVC间接修改对象属性时,会自动判断对象属性的类型,完成相应的转换. KVC按键值路径取值时,如果对象不包含指定的键值,那么就会自动进入对象内部,查找对象属性. KVC可以嵌套按照键值路径取值.