kvc可以通過key來訪問對象的某個屬性,它常見的方法有:
- (nullable id)valueForKey:(NSString *)key; //直接通過Key來取值
- (void)setValue:(nullable id)value forKey:(NSString *)key; //通過Key來設(shè)值
- (nullable id)valueForKeyPath:(NSString *)keyPath; //通過KeyPath來取值
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath; //通過KeyPath來設(shè)值
key和keyPath的區(qū)別是:如果想要訪問的是對象內(nèi)的其他對象屬性的成員蓉冈,則需要通過keyPath來訪問城舞,即
MYObject *m1 = [MYObject new];
[m1 setValue:@10 forKey:@"v1"];//v1是int屬性
[m1 setValue:@5 forKeyPath:@"obj.s1"];//obj是對象屬性
setValue的執(zhí)行順序是:
- 按照setKey,_setKey的順序查找方法寞酿,如果能找到就直接調(diào)用家夺,否則執(zhí)行第二步
- 查看accessInstanceVariablesDirectly方法的返回值,如果是yes表示可以訪問類的成員伐弹,如果是no則調(diào)用setValue:forUndefinedKey拋出異常拉馋,默認(rèn)是yes。
- 按照_key掸茅,_isKey椅邓,key,isKey的順序依照查找昧狮,如果找到了就直接賦值景馁。
通過KVC的方式修改屬性或成員變量的值,不管有沒有setter方法逗鸣,都會觸發(fā)kvo合住,它是通過willChangeVaueForKey,didChangeKeyForKey來手動觸發(fā)的。
valueForKey的執(zhí)行順序:
按照getKey, key, isKey, _key的順序查找方法撒璧,如果能找到則返回透葛,否則執(zhí)行和setKey同樣的步驟。