KVC和KVO的區(qū)別

(1)KVC:鍵-值編碼是一種間接訪問對(duì)象的屬性,使用字符串來標(biāo)識(shí)屬性,而不是通過調(diào)用存取方法,直接或通過實(shí)例變量訪問的機(jī)制。很多情況下可以簡(jiǎn)化程序代碼。

(2)KVO:鍵-值觀察機(jī)制,他提供了觀察某一屬性變化的方法,極大地簡(jiǎn)化了代碼。

比如對(duì)按鈕點(diǎn)擊變化狀態(tài)的監(jiān)控

[self addObserve:self forKeyPath:@"highlighted" option:0 context:nil];

#pragma mark KVO

+ (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

      if ([keyPath isEqualToString:@"highlighted"] {

            [self setNeedsDisplay];

      }

}

對(duì)于系統(tǒng)是根據(jù)keyPath去取得相應(yīng)的值發(fā)生改變,理論上來說是和KVC機(jī)制的道理是一樣的。

(3)KVC機(jī)制如何通過key尋找到value:

“當(dāng)通過KVC調(diào)用對(duì)象時(shí),比如:[self valueForKey:@"someKey"]時(shí),程序會(huì)自動(dòng)試圖通過集中不同的方式解析這個(gè)調(diào)用。首先查找對(duì)象是否帶有someKey這個(gè)方法,如果沒找到,會(huì)繼續(xù)查找對(duì)象是否帶有someKey這個(gè)實(shí)例變量(IVar),如果還沒有找到,程序會(huì)繼續(xù)試圖調(diào)用- (id)valueForUndefinedKey:這個(gè)方法。如果這個(gè)方法還是沒有被實(shí)現(xiàn)的話,程序會(huì)拋出一個(gè)NSUndefinedKeyException異常錯(cuò)誤。

(cocoachina.com注:Key-Value Coding查找方法的時(shí)候,不僅僅會(huì)查找someKey這個(gè)方法,還會(huì)查找getSomeKey這個(gè)方法,前面加一個(gè)get,或者_(dá)someKey以及_getSomeKey這幾種形式。同時(shí),查找實(shí)例變量的時(shí)候也會(huì)不僅僅查找someKey這個(gè)變量,也會(huì)查找_someKey這個(gè)變量是否存在。)

設(shè)計(jì)valueForUndefinedKey:方法的主要目的是當(dāng)你使用- (id)valueForKey方法從對(duì)象中請(qǐng)求值時(shí),對(duì)象能夠在錯(cuò)誤發(fā)生前,有最后的機(jī)會(huì)響應(yīng)這個(gè)請(qǐng)求。

最后編輯于
?著作權(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)容

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