- 如何理解KVC?
在iOS中每一个对象的创建属性的过程中,以KVC的角度理解会创建一个对应的键值对,这个键值对的key为设置的对象的属性值,而对于该属性的值为对应的value值。如果存在多层调用关系需要用到keypath来实现。如下Person类型实力对象有1个属性为name对这个属性的赋值以及取值的过程如下,通过key和value的形式。如果存在多层属性需要通过keypath的如p1.name形式作为key的方式来实现。
Person *p1 = [[Person alloc] init];
p1.name = @"xiaoming";
NSLog(@"name value = %@",[p1 valueForKey:@"name"]);
[p1 setValue:@"xiaohua" forKey:@"name"];
NSLog(@"name new value = %@",[p1 valueForKey:@"name"]);
- 如何理解KVO?
KVO是在kvc的基础上,通过观察观察对象属性对应的key值对应的value值得变化来检测。来实现KVO的目的。实现如下所示
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
Person *p1 = [[Person alloc] init];
p1.name = @"xiaoming";
p1.address = @"hello world";
[p1 addObserver:self
forKeyPath:@"name"
options:0
context:nil];
NSLog(@"name value = %@",[p1 valueForKey:@"name"]);
[p1 setValue:@"xiaohua" forKey:@"name"];
NSLog(@"name new value = %@",[p1 valueForKey:@"name"]);
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
if (keyPath.length>0) {
NSLog(@"name kvo value = %@",[object valueForKey:keyPath]);
}
}