问题:api
Key-value coding是一种可以对属性/成员变量间接访问的机制,是一种非正式协议,和setter/getter方法比起来更加灵活,使用字符串做为key能够在运行期间改变。bash
常见的api函数
- (void)setValue:(id)value forKey:(NSString *)key;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (id)valueForKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
复制代码
setValue:(id)value forKeyPath:(NSString *)keyPath 和 setValue:(id)value forKey:(NSString *)key 的区别ui
问题:spa
利用runtime动态生成一个子类,而且让instance对象的isa指针指向这个全新的子类,当修改instance的属性时会调用Foundation的_NSSetXXXValueAndNotify函数,在函数中
- willChangeValueForKey:
- 父类原来的setter
- didChangeValueForKey:
内部会触发监听器(Oberser)的监听方法(observeValueForKeyPath:ofObject:change:context:)
复制代码
手动调用willChangeValueForKey:和didChangeValueForKey:
复制代码
不会触发KVO,由于直接修改为员变量并无走set方法
复制代码
会触发KVO,如上流程图
复制代码