什么是KVC和KVO?兩者之間有何關系?


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來查找,編譯器不會補全,容易寫錯;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.KVC 關于 KVC 和 KVO ,我之前的總結文章有寫過,但是趨于表面,沒有探究其內部真正的實現原理和進階用...
    Liberalism閱讀 1,112評論 0 5
  • 什么是KVC和KVO?兩者之間有何關系 KVC : 鍵值編碼,是Key Value Coding 的簡稱,coco...
    蘭章海晏閱讀 3,606評論 0 3
  • 在編程中,最常見的就是程序的流程取決于你所使用的各種變量和屬性的值,根據變量和屬性的值確定后面運行的代碼,有時會檢...
    pro648閱讀 1,656評論 2 27
  • KVC 什么是 KVC KVC 是 Key-Value-Coding 的簡稱。 KVC 是一種可以直接通過字符串的...
    LeeJay閱讀 2,217評論 6 41
  • 今天是立夏,標志著夏天已悄悄來臨,氣溫的明顯升高,雨水的頻繁再加上天氣的潮濕,預示著夏天就要到了。 ...
    我的ID是長興小堂客閱讀 268評論 1 1