KVC : 鍵值編碼,是Key Value Coding 的簡稱,cocoa的標準組成部分,是一種可以直接通過字符串的名字(Key)來訪問類屬性的機制,而不是通過調用Setter方法、Getter方法進行訪問。
KVC是一個用于間接訪問對象屬性的機制(只是通過字符串訪問,而不是訪問器方法去訪問一個對象實例變量的機制),使用該機制不需要調用set或get方法和“->”方法訪問成員變量,而是通過setValue:forKey: 和 valueForKey:方法進行成員變量的訪問,將在內部查找名為_key或key的成員變量,如果找不到,就會報錯。
KVC的使用環境:無論是property還是普通的全局屬性變量,都可以使用KVC;
KVC優點:1.主要的好處就是減少代碼量;2.沒有property的變量(即:私有變量private)也能通過KVC進行設置。
KVC缺點:如果key只寫錯,編寫的時候不會報錯,但是運行的時候會報錯;
KVO : 鍵值監聽,是Key Value ObserVing 的簡稱,當指定對象的屬性被修改之后,允許對象接收到通知的機制。
KVO:是一個對象能夠觀察另外一個對象的屬性的值,并且能夠發現值得變化。KVO適合一個任意類型的對象對另外的對象進行監聽,當被監聽的對象一旦發生改變,觀察者馬上做出反應。但是也只能對屬性作出反應,而不會對方法或動作作出反應。
KVO優點:
1.能夠提供一種簡單的方法實現兩個對象的同步;
2、能夠對內部對象的狀態改變作出響應,而且不需要改變內部對象的實現;
3.能夠提供被觀察者屬性的最新值和之前的值;
4.使用key Path來觀察屬性,因此可以觀察嵌套對象;
5.完成了對觀察對象的抽象,因為不需要額外的代碼來允許觀察者被觀察。
KVO缺點:
1.我們觀察的屬性必須使用strings定義,編譯時不會出現警告;
2.對屬性重構,將導致觀察代碼不可用;
3.復雜的 “if” 語句要求對象正在觀察多個值,是因為所有的觀察代碼通過一個方法來指向;
4.當釋放觀察者的時候不需要移除觀察者。
KVO 為觀察者模式,?
[被觀察者 ?addObserver:觀察者 ? forKeyPath:被觀察的屬性 ?options: 被觀察的選項 ?context: 一般寫nil];//被觀察者通過這個方法來添加觀察者,然后只要被觀察者的keyPath值發生變化(注意:單純的改變它的值并不會調用下面的方法,只有通過getter和setter來改變才會觸發KVO),就會在觀察者里調用方法:observeValueForKeyPath:options:context ;所以,觀察著需要實現該方法對KVO發出的通知作出回應;
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context{ 著這里,通過keyPath 區分不同的觀察者,然后在進行后續的操作};
最后,調用dealloc方法,移除觀察者?
[觀察者 removeObserver:被觀察者 forKeyPath:被觀察的屬性 context:nil];
所以,總的來說,誰要進行監聽誰就注冊,然后對響應進行處理即可,這樣使觀察者與被觀察者完全解耦,運用很靈活;但是,KVO只能檢測類中的屬性,并且屬性名都是通過NSString來查找,編譯器不會補全,容易寫錯;