iOS-KVC的使用和原理

簡介

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

底層原理

  • setValue:forKey:

1.按setKey:、_setKey:的順序查找方法,找到了就傳遞參數,調用方法。 2.若是沒找到,查看accessInstanceVariablesDirectly方法的返回值,返回 NO 則調用setValue:forUndefinedKey: 並拋出異常 NSUnknownKeyExceptionorm

方法accessInstanceVariablesDirectly默認返回的是YES對象

3.若是返回 YES 按照_key、_isKey、key、isKey的順序查找成員變量,找到了就直接賦值。 4.若是沒找到,就調用setValue:forUndefinedKey: 並拋出異常NSUnknownKeyExceptionci


  • valueForKey:

1.按照getKey、key、isKey、_key的順序查找方法,找到了就直接調用。 2.若是沒找到,就查看accessInstanceVariablesDirectly 方法的返回值,返回 NO則 調用valueForUndefinedKey:並拋出異常NSUnknownKeyException。 3.若是返回 YES 按照_key、_isKey、key、isKey的順序查找成員變量。找到了就直接取值。 4.若是 沒有查找到,就調用valueForUndefinedKey:並拋出異常NSUnknownKeyExceptionget

相關文章
相關標籤/搜索