学习参考,如有错误,欢迎批评指正!!!
KVC Key-Value Coding 键值编码,可以通过一个key值来访问某个属性值
一、关于KVC的API
常见的API有一下几个
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath; - (void)setValue:(id)value forKey:(NSString *)key; - (id)valueForKeyPath:(NSString *)keyPath; - (id)valueForKey:(NSString *)key;
二、KVC的基本使用
基本使用
Person.h @interface Cat : NSObject @property (nonatomic, assign) int weight; @end @interface Person : NSObject @property (nonatomic, assign) int age; @property (nonatomic, assign) Cat *cat; @end
Person.m #import "Person.h" @implementation Person @end @implementation Cat @end
Person *person = [[Person alloc] init]; [person setValue:@10 forKey:@"age"]; Cat *cat = [[Cat alloc] init]; person.cat = cat; [person setValue:@20 forKeyPath:@"cat.weight"]; NSLog(@"person.age = %@",[person valueForKey:@"age"]); NSLog(@"person.cat.weight = %@",[person valueForKeyPath:@"cat.weight"]);
三、KVC的赋值原理
setValue:forKey的原理
- 会先按照setKey: 、_setKey:的顺序查找方法
- 如果有这两个方法中的其中一个,则直接调用方法赋值
- 如果没有找到这两个方法,则查看
+ (BOOL)accessInstanceVariablesDirectly;
这个方法的返回值(默认是YES)
- 如果
+ (BOOL)accessInstanceVariablesDirectly;
- 返回值是 NO,不允许直接给成员变量赋值
则会调用setValue:forUndefinedKey:
并抛出异常 NSUnknownKeyException
- 返回值是 YES,允许直接给成员变量赋值
会按照 _key, _isKey, key, isKey 顺序查找成员变量赋值
如果没有这四个中的任何一个,则
四、KVC的取值原理
valueForKey:原理
会先按照 getKey \ key \ isKey \ _key的顺序查找方法
如果有这几个方法则,直接调用方法取值
- 如果没有,则查看
+ (BOOL)accessInstanceVariablesDirectly;
方法的返回值
+ (BOOL)accessInstanceVariablesDirectly;
默认返回值是YES
- 返回NO, 则抛出异常 NSUnknownKeyException 报错
[XXX valueForUndefindedKey:]
- 返回YES, 则按照 _key \ _isKey \ key \ isKey 的顺序去查找成员变量,如果找到则直接取值,找不到则 报错 同上。
五、KVC能触发KVO吗?
==会触发!!!==