KVC

? ? ? ? KVC(Key-value coding)鍵值編碼,是一個基于NSKeyValueCoding非正式協(xié)議實現(xiàn)的機制,可以允許開發(fā)者通過Key名直接訪問對象的屬性,或者給對象的屬性賦值,而不需要調用明確的存取方法。這樣就可以在運行時動態(tài)地訪問和修改對象的屬性,而不是在編譯時確定。KVC是基于OC的動態(tài)特性和Runtime機制的。

NSObject(NSKeyValueCoding)

- (nullableid)valueForKey:(NSString*)key;//直接通過Key來取值

- (void)setValue:(nullableid)value forKey:(NSString*)key;//通過Key來設值

- (nullableid)valueForKeyPath:(NSString*)keyPath;//通過KeyPath來取值

- (void)setValue:(nullableid)value forKeyPath:(NSString*)keyPath;//通過KeyPath來設值

? ? ? ? KVC的定義都是對NSObject的擴展來實現(xiàn)的,OC中有個顯式的NSKeyValueCoding類別名,所以對于所有繼承了NSObject的類型,都能使用。

? ? ? ? 實現(xiàn)了訪問器方法的類中,使用點語法和KVC訪問對象其實差別不大,二者可以任意混用。但是沒有實現(xiàn)訪問器方法的類中,點語法無法使用,這時KVC就有優(yōu)勢了。KVC 不但能夠賦值,而且還能破壞只讀的特性。OC中的KVC操作很暴力,這樣做就會破壞類的封裝性,類的私有屬性和只讀屬性都可以通過KVC去訪問。

? ? ? ? KVC支持嵌套。因為類key反復嵌套,所以有個keyPath的概念,keyPath就是用.語法把一個key鏈接起來,這樣就可以根據(jù)這個路徑訪問下去(KVC在按照鍵值路徑取值時,會自動層層深入,獲取對應的鍵值)。

a.定義一個類

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;

@end

b.引用這個類

@interface OC_SWIFTViewController ()

@property (strong, nonatomic) Person *person;

@end

c.設置和獲取

- (void)viewDidLoad {

? ? [super viewDidLoad];

? ? self.person= [[Person alloc] init];

? ? [self setValue:@"Jack" forKeyPath:@"person.name"];

? ? ?NSString*name = [self?valueForKeyPath:@"person.name"];

? ? ?NSLog(@"%@",name);

}

d.輸出結果

2019-11-27 17:46:15.643288+0800 OC-Swift[6346:274818] Jack

? ? ? ? 如果開發(fā)者想讓這個類禁用KVC里,那么重寫+ (BOOL)accessInstanceVariablesDirectly方法讓其返回NO即可,這樣的話如果KVC沒有找到set屬性名時,會直接用setValue:forUndefinedKey:方法。valueForUndefinedKey:錯誤攔截,當key的值是沒有定義的,這個方法會被調用,如果你自己寫了這個方法,key的值出錯就會調用到這里來。

KVC要設值,那么就要找到對象中對應的key,KVC在內部是按什么樣的順序來尋找key的:

1.首先搜索 setter 方法,有就直接賦值。

2.如果上面的 setter 方法沒有找到,再檢查類方法+ (BOOL)accessInstanceVariablesDirectly

i.返回 NO,則執(zhí)行setValue:forUNdefinedKey:

ii.返回 YES,則按_<key>,_<isKey>,<key>,<isKey>的順序搜索成員名。

3.還沒有找到的話,就調用setValue:forUndefinedKey:

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • KVC(Key-valuecoding)鍵值編碼,單看這個名字可能不太好理解。其實翻譯一下就很簡單了,就是指iOS...
    榕樹頭閱讀 772評論 0 2
  • KVC(Key-value coding)鍵值編碼,單看這個名字可能不太好理解。其實翻譯一下就很簡單了,就是指iO...
    我的夢工廠閱讀 939評論 1 8
  • 什么是KVC? KVC(Key-value coding)鍵值編碼,單看這個名字可能不太好理解。其實是指iOS的開...
    祀夢_閱讀 983評論 0 7
  • 什么是KVC? KVC(Key-value coding)鍵值編碼,單看這個名字可能不太好理解。其實是指iOS的開...
    薩繆閱讀 4,825評論 1 13
  • “老師,李立松跟朱怡喆打架啦!朱怡喆受傷啦!”一個學生急匆匆的跑到辦公室跟我告狀。“怎么回事?你趕快回去把他兩...
    N1115丁麗閱讀 455評論 2 1

友情鏈接更多精彩內容