(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)求必搞。