KVC(Key Value Coding)
是一種能夠經過key來訪問類屬性的機制。而不是經過調用Setter、Getter
方法訪問。能夠在運行時動態訪問和修改對象的屬性。 KVC的方法定義在Foundation/NSKeyValueCoding
中。編程
提供了經常使用的方法:數組
-(void)setValue:(id)value forKeyPath:(NSString *)keyPath;
-(void)setValue:(id)value forKey:(NSString *)key;
-(id)valueForKeyPath:(NSString *)keyPath;
-(id)valueForKey:(NSString *)key;
複製代碼
使用1: 假如name是自定義Person類的一個屬性,使用KVC。markdown
// 賦值
[person1 setValue:@"jack" forKey:@"name"];
// 取值
NSString *name = [person1 valueForKey:@"name"];
複製代碼
使用2: forKeyPath
是對更「深層」的對象進行訪問。如數組的某個元素,對象的某個屬性。如:spa
[myModel setValue:@"beijing" forKeyPath:@"address.city"];
// 返回全部對象的name屬性值
NSArray *names = [array valueForKeyPath:@"name"];
複製代碼
KVC和KVO都屬於鍵值編程,並且底層實現機制都是isa-swizzingcode
1.按setKey:、_setKey:
的順序查找方法,找到了就傳遞參數,調用方法。 2.若是沒找到,查看accessInstanceVariablesDirectly
方法的返回值,返回 NO
則調用setValue:forUndefinedKey:
並拋出異常 NSUnknownKeyException
。orm
方法
accessInstanceVariablesDirectly
默認返回的是YES
對象
3.若是返回 YES
按照_key、_isKey、key、isKey
的順序查找成員變量,找到了就直接賦值。 4.若是沒找到,就調用setValue:forUndefinedKey:
並拋出異常NSUnknownKeyException
。ci
1.按照getKey、key、isKey、_key
的順序查找方法,找到了就直接調用。 2.若是沒找到,就查看accessInstanceVariablesDirectly
方法的返回值,返回 NO
則 調用valueForUndefinedKey:
並拋出異常NSUnknownKeyException
。 3.若是返回 YES
按照_key、_isKey、key、isKey
的順序查找成員變量。找到了就直接取值。 4.若是 沒有查找到,就調用valueForUndefinedKey:
並拋出異常NSUnknownKeyException
。get