KVC, KVO

KVC (Key-Value Coding)键值编码。

即是NSKeyValueCoding 一个非正式的Protocol,提供了一种间接访问对象属性的机制。

作用:设置属性值

1     [self setValue:@"" forKey:@""];
2     //可以通过点语法来赋值(跨层级)
3     [self setValue:@"" forKeyPath:@"key.key"];

        获取属性值

1     [self valueForKey:@""];
2     /// 获取属性值,可以跨层级获取
3     [self valueForKeyPath:@"key.key"];

       将字典转化为模型

1 //用字典对实例进行赋值
2 [p setValuesForKeysWithDictionary:dic];
3 // 在model要实现的方法。
4 - (void)setValue:(id)value forUndefinedKey:(NSString *)key {
5     //外部没有定义的属性。不实现的话,遇到外部没有定义的Key会Crash
6 }

KVO(Key-Value Observing)键值观察者

KVO建立在KVC之上,他能够观察一个对象的KVC Key Path的值的变化。

原理:在注册观察者时,系统会在运行时生成一个派生类,派生类重写了该对象的setter方法,并且在setter方法中实现了通知机制。同时派生类重写了class方法,以欺骗外部调用者,系统将该类的isa指针指向派生类,因此该对象就是派生类的新对象了,因此会调用该对象的setter就相当于调用派生类的setter,从而激活键值通知机制。还重写了dealloc方法来释放资源。

主要使用的是三个方法

        /// 添加观察者
        - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;
        /// 监听到值改变
        - (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary<NSKeyValueChangeKey, id> *)change context:(nullable void *)context;
        /// 移除观察者,便面内存泄漏
        - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;

猜你喜欢

转载自www.cnblogs.com/jisa/p/9183961.html