KVC和KVO的區別

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

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

比如對按鈕點擊變化狀態的監控

[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];

      }

}

對于系統是根據keyPath去取得相應的值發生改變,理論上來說是和KVC機制的道理是一樣的。

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

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

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

設計valueForUndefinedKey:方法的主要目的是當你使用- (id)valueForKey方法從對象中請求值時,對象能夠在錯誤發生前,有最后的機會響應這個請求。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容