注:文章为自己学习李明杰老师的OC底层视频做的随手笔记
KVC的全程是key-value-coding,俗称"键值编码",可以通过一个key来访问某个属性
常见API
setValue:(nullable id) forKey:(nonnull NSString *)
setValue:(nullable id) forKeyPath:(nonnull NSString *)
valueForKey:(nonnull NSString *)
valueForKeyPath:(nonnull NSString *)
setValue:(nullable id) forKey:(nonnull NSString *)和setValue:(nullable id) forKeyPath:(nonnull NSString *)的区别
demo:
新建一个person类和cat类,person有属性age和cat,cat类有个weight的属性
那么.再给person的age属性赋值的时候,除了点语法外,这两个方法都可用,没有区别,但是在给属性cat下的weight赋值,就只能用forKeyPath了,他俩的区别就是一个是寻找路径,一个是具体的属性名称,简单来说,keypath的功能更强大
取值方法同理
NSLog(@"%@",[p valueForKeyPath:@"age"]);
NSLog(@"%@",[p valueForKeyPath:@"cat.weight"]);
Q:通过KVC赋值,会不会触发KVO?
A:会
解析:
setValueForKey的原理:
重写age的set方法,发现用kvc赋值,会走age的set方法
valueForKey,原理其实还是调用属性的get方法
相对于KVO,KVC的东西不是特别多