KVC相关知识(笔记)
2022-04-13 本文已影响0人
我家冰箱养企鹅
kvc可以通过key来访问对象的某个属性,它常见的方法有:
- (nullable id)valueForKey:(NSString *)key; //直接通过Key来取值
- (void)setValue:(nullable id)value forKey:(NSString *)key; //通过Key来设值
- (nullable id)valueForKeyPath:(NSString *)keyPath; //通过KeyPath来取值
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath; //通过KeyPath来设值
key和keyPath的区别是:如果想要访问的是对象内的其他对象属性的成员,则需要通过keyPath来访问,即
MYObject *m1 = [MYObject new];
[m1 setValue:@10 forKey:@"v1"];//v1是int属性
[m1 setValue:@5 forKeyPath:@"obj.s1"];//obj是对象属性
setValue的执行顺序是:
- 按照setKey,_setKey的顺序查找方法,如果能找到就直接调用,否则执行第二步
- 查看accessInstanceVariablesDirectly方法的返回值,如果是yes表示可以访问类的成员,如果是no则调用setValue:forUndefinedKey抛出异常,默认是yes。
- 按照_key,_isKey,key,isKey的顺序依照查找,如果找到了就直接赋值。
通过KVC的方式修改属性或成员变量的值,不管有没有setter方法,都会触发kvo,它是通过willChangeVaueForKey,didChangeKeyForKey来手动触发的。
valueForKey的执行顺序:
按照getKey, key, isKey, _key的顺序查找方法,如果能找到则返回,否则执行和setKey同样的步骤。