iOS Runtime之KVC

Runtime系列導(dǎo)讀

簡(jiǎn)介

KVC是Key Value Coding的縮寫,意思是鍵值編碼。 在iOS中,提供了一種方法通過使用屬性的名稱(也就是Key)來間接訪問對(duì)象屬性的方法,這個(gè)方法可以不通過getter/setter方法來訪問對(duì)象的屬性。 用KVC可以間接訪問對(duì)象屬性的機(jī)制。通常我們使用valueForKey 來替代getter 方法,setValue:forKey來代替setter方法。

用法

  • 常見API

    • - (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
    • - (void)setValue:(id)value forKey:(NSString *)key;
    • - (id)valueForKeyPath:(NSString *)keyPath;
    • - (id)valueForKey:(NSString *)key;
  • 調(diào)用方式

-(void)testKVO2
{
    self.test = [KVOTest new];
    
    [self.test setValue:@(10) forKey:@"age"];
    NSKeyValueObservingOptions option = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;
    [self.test addObserver:self forKeyPath:@"age" options:option context:nil];
    [self.test setValue:@(20) forKey:@"age"];
    NSLog(@"%ld", [[self.test valueForKey:@"age"] integerValue]);
}
  • 打印日志
2022-06-25 22:25:06.887730+0800 StudyApp[31993:1358988] age - {
    kind = 1;
    new = 20;
    old = 10;
}
2022-06-25 22:25:06.887791+0800 StudyApp[31993:1358988] didChangeValueForKey:age,0x600001ce8470
2022-06-25 22:25:06.887835+0800 StudyApp[31993:1358988] 20

實(shí)現(xiàn)原理

網(wǎng)上對(duì)于這塊的講解比較多,我就不重復(fù)描述了,轉(zhuǎn)載兩個(gè)比較好描述該原理的流程圖。

  • setValue:forKey:的原理
image.png
  • valueForKey:的原理
image.png

答疑

給不存在的屬性賦值,會(huì)怎么樣?

  • 會(huì)crash
[self.test setValue:@(10) forKey:@"age1"]; // 產(chǎn)生以下crash

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<KVOTest 0x600002ed45f0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key age1.'

給不存在的屬性取值,會(huì)怎么樣?

  • 會(huì)crash
[self.test valueForKey:@"age1"] // 產(chǎn)生以下Crash

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<KVOTest 0x6000033dc620> valueForUndefinedKey:]: this class is not key value coding-compliant for the key age1.'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • KVC定義 KVC(Key-value coding)鍵值編碼,就是指iOS的開發(fā)中,可以允許開發(fā)者通過Key名直...
    SheIsMySin_72e7閱讀 423評(píng)論 0 0
  • KVC KVC定義 KVC(Key-value coding)鍵值編碼,就是指iOS的開發(fā)中,可以允許開發(fā)者通過K...
    戀空K閱讀 833評(píng)論 0 2
  • KVC KVC定義 KVC(Key-value coding)鍵值編碼,就是指iOS的開發(fā)中,可以允許開發(fā)者通過K...
    暮年古稀ZC閱讀 2,295評(píng)論 2 9
  • KVC 簡(jiǎn)介 KVC全稱是Key Value Coding(鍵值編碼),是一個(gè)基于NSKeyValueCoding...
    rightmost閱讀 920評(píng)論 0 0
  • 什么是KVC? KVC(Key-value coding)鍵值編碼,單看這個(gè)名字可能不太好理解。其實(shí)是指iOS的開...
    祀夢(mèng)_閱讀 983評(píng)論 0 7

友情鏈接更多精彩內(nèi)容