(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方法從對象中請求值時,對象能夠在錯誤發生前,有最后的機會響應這個請求。