1.KVC
KVC即指NSKeyValueCoding, 一種可以通過(guò)key的名稱間接訪問(wèn)property的機(jī)制
UIFont *font = [[self label] font];
UIFont *font2 = [[self valueForKey:@"label"] valueForKey:@"font"];
UIFont *font3 = [self valueForKeyPath:@"label.font"];
以上三行代碼等價(jià)渴频,留意keyPath的用法
[self setValue:[UIColor yellowColor] forKeyPath:@"label.backgroundColor"];
2.KVO
KVO即Key-Value Observing,是建立在KVC基礎(chǔ)上的扒磁,一種可以觀察對(duì)象keyPath對(duì)應(yīng)值變化的機(jī)制。
KVO的是通過(guò)isa-swizzling實(shí)現(xiàn)的遏乔,流程如下:編譯器自動(dòng)為被觀察對(duì)象創(chuàng)建一個(gè)派生類(NSKVONotifying_XXX)义矛,并將被觀察對(duì)象的isa指向這個(gè)派生類。如果用戶注冊(cè)了對(duì)此對(duì)象某一個(gè)屬性的觀察盟萨,此派生類會(huì)重寫(xiě)該屬性的set方法凉翻,并添加響應(yīng)的通知代碼。Objective-C在發(fā)送消息時(shí)鸯旁,會(huì)通過(guò)isa指針找到當(dāng)前對(duì)象所屬的類對(duì)象噪矛,向此對(duì)象發(fā)送消息的時(shí)候,實(shí)際發(fā)送到了派生類override的方法铺罢,且其中有通知代碼艇挨。因此會(huì)向observer發(fā)送通知。
[[Person sharedInstance] addObserver:self.label forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
NSLog(@"%@", [[Person sharedInstance] class]);
//打印isa指針
NSLog(@"%@", object_getClass([Person sharedInstance]));
WPSafeKVO[7368:385349] Person
WPSafeKVO[7368:385349] NSKVONotifying_Person
3.KVO使用時(shí)的注意點(diǎn)
1.addObserver 和 removeObserver必須成對(duì)出現(xiàn)韭赘,不論是少移除還是重復(fù)移除缩滨,都會(huì)導(dǎo)致crash