KVC (NSKeyValueCoding)一個非正式的 Protocol,提供一種機制來間接訪問對象的屬性。KVO 就是基于 KVC 實現(xiàn)的關(guān)鍵技術(shù)之一。
KVC(Key-value coding)鍵值編碼,顧名思義。額,簡單來說,是可以通過對象屬性名稱(Key)直接給屬性值(value)編碼(coding)“編碼”可以理解為“賦值”。這樣可以免去我們調(diào)用getter和setter方法,從而簡化我們的代碼,也可以用來修改系統(tǒng)控件內(nèi)部屬性
iOS的開發(fā)中,可以允許開發(fā)者通過Key名直接訪問對象的屬性,或者給對象的屬性賦值。而不需要調(diào)用明確的存取方法。這樣就可以在運行時動態(tài)在訪問和修改對象的屬性。而不是在編譯時確定,這也是iOS開發(fā)中的黑魔法之一。
- (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è)值
@interface AnimalModel : NSObject
@property (nonatomic, strong) NSString *kind;
@property (nonatomic, strong)KindModel * model;
@end
@implementation AnimalModel
- (instancetype)init
{
self = [super init];
if (self) {
self.model = [[KindModel alloc] init];
}
return self;
}
@end
@interface KindModel : NSObject
@property (nonatomic,strong)NSString * kindName;
@end
AnimalModel * model = [[AnimalModel alloc] init];
[model setValue:@"reptile" forKey:@"kind"];
[model setValue:@"pander" forKeyPath:@"model.kindName"];
NSString * kind = [model valueForKey:@"kind"];
NSString * kindName = [model valueForKeyPath:@"model.kindName"];
NSLog(@"kind =======%@, name========%@",kind,kindName);
NSMutableDictionary * dic = [[NSMutableDictionary alloc] init];
[dic setObject:@"reptile1" forKey:@"kind"];
[dic setObject:model.model forKey:@"model"];
[model setValuesForKeysWithDictionary:dic];
NSLog(@"kind1 =======%@, name1========%@",model.kind,model.model.kindName);
賦值原理
AnimalModel 查找是否有對應(yīng)屬性kind的 set方法 如果存在就調(diào)用set方法賦值
[self setKind:dic[@"kind"]]如果沒有 會接著找 kind 屬性 kind = dic[@"kind"]
如果找不到 會繼續(xù)查找 _kind _kind = dic[@"kind"]
都找不到就會崩潰 -(void)setValue:(id)value forUndefinedKey:(NSString *)key