KVC : 鍵值編碼们妥,是Key Value Coding 的簡(jiǎn)稱世落,cocoa的標(biāo)準(zhǔn)組成部分,是一種可以直接通過字符串的名字(Key)來訪問類屬性的機(jī)制昌犹,而不是通過調(diào)用Setter方法坚芜、Getter方法進(jìn)行訪問。
KVC是一個(gè)用于間接訪問對(duì)象屬性的機(jī)制(只是通過字符串訪問斜姥,而不是訪問器方法去訪問一個(gè)對(duì)象實(shí)例變量的機(jī)制)鸿竖,使用該機(jī)制不需要調(diào)用set或get方法和“->”方法訪問成員變量,而是通過setValue:forKey: 和 valueForKey:方法進(jìn)行成員變量的訪問铸敏,將在內(nèi)部查找名為_key或key的成員變量缚忧,如果找不到,就會(huì)報(bào)錯(cuò)杈笔。
KVC的使用環(huán)境:無論是property還是普通的全局屬性變量闪水,都可以使用KVC;
KVC優(yōu)點(diǎn):1.主要的好處就是減少代碼量蒙具;2.沒有property的變量(即:私有變量private)也能通過KVC進(jìn)行設(shè)置球榆。
KVC缺點(diǎn):如果key只寫錯(cuò)峰弹,編寫的時(shí)候不會(huì)報(bào)錯(cuò),但是運(yùn)行的時(shí)候會(huì)報(bào)錯(cuò)芜果;
KVO : 鍵值監(jiān)聽,是Key Value ObserVing 的簡(jiǎn)稱融师,當(dāng)指定對(duì)象的屬性被修改之后右钾,允許對(duì)象接收到通知的機(jī)制。
KVO:是一個(gè)對(duì)象能夠觀察另外一個(gè)對(duì)象的屬性的值旱爆,并且能夠發(fā)現(xiàn)值得變化舀射。KVO適合一個(gè)任意類型的對(duì)象對(duì)另外的對(duì)象進(jìn)行監(jiān)聽,當(dāng)被監(jiān)聽的對(duì)象一旦發(fā)生改變怀伦,觀察者馬上做出反應(yīng)脆烟。但是也只能對(duì)屬性作出反應(yīng),而不會(huì)對(duì)方法或動(dòng)作作出反應(yīng)房待。
KVO優(yōu)點(diǎn):
1.能夠提供一種簡(jiǎn)單的方法實(shí)現(xiàn)兩個(gè)對(duì)象的同步邢羔;
2、能夠?qū)?nèi)部對(duì)象的狀態(tài)改變作出響應(yīng)桑孩,而且不需要改變內(nèi)部對(duì)象的實(shí)現(xiàn)拜鹤;
3.能夠提供被觀察者屬性的最新值和之前的值;
4.使用key Path來觀察屬性流椒,因此可以觀察嵌套對(duì)象敏簿;
5.完成了對(duì)觀察對(duì)象的抽象,因?yàn)椴恍枰~外的代碼來允許觀察者被觀察宣虾。
KVO缺點(diǎn):
1.我們觀察的屬性必須使用strings定義惯裕,編譯時(shí)不會(huì)出現(xiàn)警告;
2.對(duì)屬性重構(gòu)绣硝,將導(dǎo)致觀察代碼不可用蜻势;
3.復(fù)雜的 “if” 語句要求對(duì)象正在觀察多個(gè)值,是因?yàn)樗械挠^察代碼通過一個(gè)方法來指向域那;
4.當(dāng)釋放觀察者的時(shí)候不需要移除觀察者咙边。
KVO 為觀察者模式,?
[被觀察者 ?addObserver:觀察者 ? forKeyPath:被觀察的屬性 ?options: 被觀察的選項(xiàng) ?context: 一般寫nil];//被觀察者通過這個(gè)方法來添加觀察者次员,然后只要被觀察者的keyPath值發(fā)生變化(注意:?jiǎn)渭兊母淖兯闹挡⒉粫?huì)調(diào)用下面的方法败许,只有通過getter和setter來改變才會(huì)觸發(fā)KVO),就會(huì)在觀察者里調(diào)用方法:observeValueForKeyPath:options:context 淑蔚;所以市殷,觀察著需要實(shí)現(xiàn)該方法對(duì)KVO發(fā)出的通知作出回應(yīng);
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context{ 著這里刹衫,通過keyPath 區(qū)分不同的觀察者醋寝,然后在進(jìn)行后續(xù)的操作}搞挣;
最后,調(diào)用dealloc方法音羞,移除觀察者?
[觀察者 removeObserver:被觀察者 forKeyPath:被觀察的屬性 context:nil];
所以囱桨,總的來說,誰要進(jìn)行監(jiān)聽誰就注冊(cè)嗅绰,然后對(duì)響應(yīng)進(jìn)行處理即可舍肠,這樣使觀察者與被觀察者完全解耦,運(yùn)用很靈活窘面;但是翠语,KVO只能檢測(cè)類中的屬性,并且屬性名都是通過NSString來查找财边,編譯器不會(huì)補(bǔ)全肌括,容易寫錯(cuò);