學習參考,如有錯誤远荠,歡迎批評指正!Jⅰ譬淳!
KVC Key-Value Coding 鍵值編碼,可以通過一個key值來訪問某個屬性值
一根时、關于KVC的API
常見的API有一下幾個
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath; - (void)setValue:(id)value forKey:(NSString *)key; - (id)valueForKeyPath:(NSString *)keyPath; - (id)valueForKey:(NSString *)key;
二瘦赫、KVC的基本使用
基本使用
Person.h @interface Cat : NSObject @property (nonatomic, assign) int weight; @end @interface Person : NSObject @property (nonatomic, assign) int age; @property (nonatomic, assign) Cat *cat; @end
Person.m #import "Person.h" @implementation Person @end @implementation Cat @end
Person *person = [[Person alloc] init]; [person setValue:@10 forKey:@"age"]; Cat *cat = [[Cat alloc] init]; person.cat = cat; [person setValue:@20 forKeyPath:@"cat.weight"]; NSLog(@"person.age = %@",[person valueForKey:@"age"]); NSLog(@"person.cat.weight = %@",[person valueForKeyPath:@"cat.weight"]);
三、KVC的賦值原理
setValue:forKey的原理
- 會先按照setKey: 蛤迎、_setKey:的順序查找方法
- 如果有這兩個方法中的其中一個确虱,則直接調(diào)用方法賦值
- 如果沒有找到這兩個方法,則查看
+ (BOOL)accessInstanceVariablesDirectly;
這個方法的返回值(默認是YES)
- 如果
+ (BOOL)accessInstanceVariablesDirectly;
- 返回值是 NO替裆,不允許直接給成員變量賦值
則會調(diào)用setValue:forUndefinedKey:
并拋出異常 NSUnknownKeyException
1.png
- 返回值是 YES校辩,允許直接給成員變量賦值
會按照 _key, _isKey, key, isKey 順序查找成員變量賦值
3.png如果沒有這四個中的任何一個,則
5.png
四辆童、KVC的取值原理
valueForKey:原理
會先按照 getKey \ key \ isKey \ _key的順序查找方法
如果有這幾個方法則宜咒,直接調(diào)用方法取值
10.png- 如果沒有,則查看
+ (BOOL)accessInstanceVariablesDirectly;
方法的返回值
+ (BOOL)accessInstanceVariablesDirectly;
默認返回值是YES
- 返回NO, 則拋出異常 NSUnknownKeyException 報錯
[XXX valueForUndefindedKey:]
11.png- 返回YES, 則按照 _key \ _isKey \ key \ isKey 的順序去查找成員變量把鉴,如果找到則直接取值故黑,找不到則 報錯 同上。
五庭砍、KVC能觸發(fā)KVO嗎场晶?
==會觸發(fā)!5「住诗轻!==
13.png