KVC的基本用法
- KVC的全称key - value - coding,俗称"键值编码",可以通过key来访问某个属性
- 常见的API有:
- (void)setValue:(id)value forKey:(NSString *)key;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (id)valueForKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
代码演示如下,先创建两个类:Person
和Cat
#import <Foundation/Foundation.h>
@interface Cat : NSObject
@property (nonatomic, assign) int weight;
@end
@interface Person : NSObject
@property (nonatomic, assign) int age;
@property (nonatomic, strong) Cat *cat;
@end
- (void)viewDidLoad {
[super viewDidLoad];
Person *person = [[Person alloc]init];
person.cat = [[Cat alloc]init];
[person setValue:@20 forKey:@"age"];
[person setValue:@20 forKeyPath:@"cat.weight"];
NSLog(@"%d",person.age);
NSLog(@"%d",person.cat.weight);
NSLog(@"%@",[person valueForKey:@"age"]);
NSLog(@"%@",[person valueForKeyPath:@"cat.weight"]);
}
setValue:forKeyPath:
和 setValue: forKey:
的区别:
- keyPath 相当于根据路径去寻找属性,一层一层往下找
- key 是直接拿属性的名字设置,如果按路径找会报错
KVC的基本原理
setValue:forKey:的原理
当我们设置setValue:forKey:
时,内部的调用流程是:
- 首先会依次查找是否存在
setKey:
、_setKey
方法,如果有则直接调用 - 如果没有,则查看
accessInstanceVariablesDirectly
方法的返回值,这个方法表示是否可以直接访问成员变量,默认值是YES,如果可以,则会按照_key
、_isKey
、key
、iskey
的顺序查找成员变量,如果找到了则直接赋值 - 如果没有找到,则调用
setValue:forUndefinedKey:
方法并抛出NSUnknowKeyException
异常
valueForKey:的原理
调用流程是:
- 按照
getKey
、key
、iskey
、_key
的顺序依次查找方法,如果找到则直接调用 - 如果没有找到方法,则查看
accessInstanceVariablesDirectly
方法的返回值 - 如果可以访问会按照
_key
、_isKey
、key
、iskey
的顺序依次查找成员变量,找到了则直接赋值 - 如果没有找到,则报
NSUnkonwKeyException
错误
面试题
- 通过KVC修改属性会触发KVO吗?
- 会触发KVO,直接修改成员变量的值是触发不了KVO的
- KVC的赋值
网友评论