?概述
KVC/KVO是觀察者模式的一種實現(xiàn),在Cocoa中是以被萬物之源
NSObject類實現(xiàn)的NSKeyValueCoding/NSKeyValueObserving
非正式協(xié)議的形式被定義為基礎(chǔ)框架的一部分。
從協(xié)議的角度來說:
KVC/KVO本質(zhì)上是定義了一套讓我們?nèi)プ袷睾蛯崿F(xiàn)的方法
KVC/KVO實現(xiàn)的根本是Objective-C的動態(tài)性和runtime。
?鍵值編碼KVC
全稱是Key-value observing,翻譯成鍵值觀察。
提供了一種當其它對象屬性被修改的時候能通知當前對象的機制。
再MVC大行其道的Cocoa中,KVO機制很適合實現(xiàn)model和controller類之間的通訊。
?KVC的操作方法由NSKeyValueCoding協(xié)議提供,而NSObject就實現(xiàn)了這個協(xié)議,
也就是說ObjC中幾乎所有的對象都支持KVC操作。
常用的KVC操作方法如下:
動態(tài)設置:
setValue:屬性值 forKey:屬性(用于簡單路徑)
setValue:屬性值 forKeyPath:屬性路徑(用于復合路徑)
例如 Person有一個name類型的屬性,那么person.namet就是一個復合屬性)
動態(tài)讀?。?
valueForKey:屬性名 、
valueForKeyPath:屬性名(用于復合路徑)
KVC使用起來比較簡單,但是它如何查找一個屬性進行讀取呢?
具體查找規(guī)則(假設現(xiàn)在要利用KVC對a進行讀取)
如果是動態(tài)設置屬性:
則優(yōu)先考慮調(diào)用setA方法,
如果沒有該方法則優(yōu)先考慮搜索成員變量_a,如果仍然不存在則搜索成員變量a,
如果最后仍然沒搜索到則會調(diào)用這個類的setValue:forUndefinedKey:方法
注意:搜索過程中不管這些方法、成員變量是私有的還是公共的都能正確設置
如果是動態(tài)讀取屬性
則優(yōu)先考慮調(diào)用a方法(屬性a的getter方法),
如果沒有搜索到則會優(yōu)先搜索成員變量_a,
如果仍然不存在則搜索成員變量a,
如果最后仍然沒搜索到則會調(diào)用這個類的valueforUndefinedKey:方法
注意:搜索過程中不管這些方法、成員變量是私有的還是公共的都能正確讀取
?點語法和KVC
在上面介紹的
動態(tài)讀取 中的KeyPath是一個被點操作符隔開的用于訪問對象的指定屬性的字符串序列。
比如KeyPath address.
將會訪問消息接收對象所包含的person.name屬性中包含的一個name屬性。
其實KeyPath說白了就是我們平時使用點操作訪問某個對象的屬性時所寫的那個字符串。
在實現(xiàn)了訪問器方法的類中,使用點語法和KVC訪問對象其實差別不大,二者可以任意混用。
但是沒有訪問起方法的類中,點語法無法使用,這時KVC就有優(yōu)勢了。
? 鍵值監(jiān)聽KVO
KVO其實是一種觀察者模式,利用它可以很容易實現(xiàn)視圖組件和數(shù)據(jù)模型的分離,
當數(shù)據(jù)模型的屬性值改變之后作為監(jiān)聽器的視圖組件就會被激發(fā),激發(fā)時就會回調(diào)監(jiān)聽器自身。
在ObjC中要實現(xiàn)KVO則必須實現(xiàn)NSKeyValueObServing協(xié)議,不過幸運的是NSObject已經(jīng)實現(xiàn)了該協(xié)議,
因此幾乎所有的ObjC對象都可以使用KVO。
常用的操作方法如下:
注冊指定Key路徑的監(jiān)聽器:
addObserver: forKeyPath: options: context:
刪除指定Key路徑的監(jiān)聽器:
removeObserver: forKeyPath、
removeObserver: forKeyPath: context:
回調(diào)監(jiān)聽:
observeValueForKeyPath: ofObject: change: context:
?KVO的使用步驟也比較簡單:
通過addObserver: forKeyPath: options: context:為被監(jiān)聽對象
(它通常是數(shù)據(jù)模型)注冊監(jiān)聽器
重寫監(jiān)聽器的observeValueForKeyPath: ofObject: change: context:方法
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。