iOS开发 - KVO/KVC

KVC
//KVC 键值编码
[dog setValue:@”小强” forKey:@”name”];
NSLog(@”%@”,[dog valueForKey:@”name”]);
//把属性的名字和key对应起来/映射的形式进行访问

//KVC 是对NSObject扩展的一个类别
//- (void)setValue:(nullable id)value forKey:(NSString *)key;是类别里的一个方法
//父类扩展的类别,子类也同样拥有了这个类别,所有的对象度可以使用KVC的方式访问属性

//依据KVC的方式 给每个属性进行赋值 前提是对象的属性的名字和字典里的key值名字相同
[dog setValuesForKeysWithDictionary:dic];

//当字典内有key值和属性的名字对应不上的时候,会自动调用这个方法
//需要重写此方法
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{

//key 字典里对应不上的key值
if ([key isEqualToString:@"性别"]) {
    //value 字典里key对应的value
    self.sex = value;}

}

KVO
//注册
//person就是被观察的对象
//第一个参数 观察者(对person的某个属性感兴趣的那个对象)
//第二个参数 被观察者的属性
//第三个参数 对新值还是旧值进行观察
[self.person addObserver:self forKeyPath:@”sex” options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
/*
NSKeyValueObservingOptionNew = 0x01,
NSKeyValueObservingOptionOld = 0x02,
*/

//一旦被观察者的属性发生变化 观察者就会自动调用这个方法
-(void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object change:(NSDictionary )change context:(void *)context{
//keyPath 被观察的属性
//object 被观察者
//change 改变前后属性的值都可以通过这个字典拿到
// change[@”new”] 新值
// change[@”old”] 旧值

if ([object isKindOfClass:[Person class]]) {

    if (![change[@"new"] isEqualToString:change[@"old"]]) {
    NSLog(@"..");
    }
}
if ([object isKindOfClass:[UIView class]]) {

    UIColor * color = change[@"new"];

    NSLog(@"%@",color);
}

}

你可能感兴趣的:(iOS开发 - KVO/KVC)