鍵路徑(keyPath)、鍵值編碼(KVC)和鍵值觀察(KVO)

鍵路徑(keyPath)

在一個(gè)給定的實(shí)體中,同一個(gè)屬性的所有值具有相同的數(shù)據(jù)類型屋讶。

鍵-值編碼技術(shù)用于進(jìn)行這樣的查找—它是一種間接訪問對(duì)象屬性的機(jī)制商虐。

鍵路徑是一個(gè)由用點(diǎn)作分隔符的鍵組成的字符串,用于指定一個(gè)連接在一起的對(duì)象性質(zhì)序列。

第一個(gè)鍵的性質(zhì)是由先前的性質(zhì)決定的,接下來每個(gè)鍵的值也是相對(duì)于其前面的性質(zhì)稻爬。

鍵路徑使您可以以獨(dú)立于模型實(shí)現(xiàn)的方式指定相關(guān)對(duì)象的性質(zhì)嗜闻。

通過鍵路徑,您可以指定對(duì)象圖中的一個(gè)任意深度的路徑,使其指向相關(guān)對(duì)象的特定屬性。

鍵值編碼(KVC)

鍵值編碼是一種間接訪問對(duì)象的屬性使用字符串來標(biāo)識(shí)屬性桅锄,

而不是通過調(diào)用存取方法泞辐,直接或通過實(shí)例變量訪問的機(jī)制笔横,

非對(duì)象類型的變量將被自動(dòng)封裝或者解封成對(duì)象,很多情況下會(huì)簡(jiǎn)化程序代碼咐吼;

KVC的缺點(diǎn):

一旦使用 KVC 你的編譯器無法檢查出錯(cuò)誤,即不會(huì)對(duì)設(shè)置的鍵吹缔、鍵路徑進(jìn)行錯(cuò)誤檢查,

且執(zhí)行效率要低于合成存取器方法和自定的 setter 和 getter 方法。

因?yàn)槭褂?KVC 鍵值編碼,它必須先解析字符串,然后在設(shè)置或者訪問對(duì)象的實(shí)例變量锯茄。

鍵值觀察(KVO)

鍵值觀察機(jī)制是一種能使得對(duì)象獲取到其他對(duì)象屬性變化的通知 厢塘,極大的簡(jiǎn)化了代碼。

實(shí)現(xiàn) KVO 鍵值觀察模式肌幽,被觀察的對(duì)象必須使用 KVC 鍵值編碼來修改它的實(shí)例變量晚碾,

這樣才能被觀察者觀察到。

因此喂急,KVC是KVO的基礎(chǔ)格嘁。

Demo

比如我自定義的一個(gè)button

[self?addObserver:self?forKeyPath:@"highlighted"options:0?context:nil];

#pragma?mark?KVO

-?(void)observeValueForKeyPath:(NSString?*)keyPath?ofObject:(id)object?change:(NSDictionary?*)change?context:(void?*)context

{

if([keyPath?isEqualToString:@"highlighted"]?)?{

[self?setNeedsDisplay];

}

}

對(duì)于系統(tǒng)是根據(jù)keypath去取的到相應(yīng)的值發(fā)生改變,理論上來說是和kvc機(jī)制的道理是一樣的廊移。

KVC機(jī)制通過key找到value的原理

當(dāng)通過KVC調(diào)用對(duì)象時(shí)糕簿,比如:[self valueForKey:@”someKey”]時(shí),

程序會(huì)自動(dòng)試圖通過下面幾種不同的方式解析這個(gè)調(diào)用狡孔。

首先查找對(duì)象是否帶有 someKey 這個(gè)方法懂诗,

如果沒找到,會(huì)繼續(xù)查找對(duì)象是否帶有someKey這個(gè)實(shí)例變量(iVar)苗膝,

如果還沒有找到殃恒,程序會(huì)繼續(xù)試圖調(diào)用 -(id) valueForUndefinedKey:這個(gè)方法。

如果這個(gè)方法還是沒有被實(shí)現(xiàn)的話辱揭,程序會(huì)拋出一個(gè)NSUndefinedKeyException異常錯(cuò)誤离唐。

補(bǔ)充:

KVC查找方法的時(shí)候,

不僅僅會(huì)查找someKey這個(gè)方法问窃,

還會(huì)查找getsomeKey這個(gè)方法侯繁,

前面加一個(gè)get,或者_(dá)someKey以_getsomeKey這幾種形式泡躯。

同時(shí)贮竟,查找實(shí)例變量的時(shí)候也會(huì)不僅僅查找someKey這個(gè)變量,

也會(huì)查找_someKey這個(gè)變量是否存在较剃。

設(shè)計(jì)valueForUndefinedKey:方法的主要目的是

當(dāng)你使用-(id)valueForKey方法從對(duì)象中請(qǐng)求值時(shí)咕别,

對(duì)象能夠在錯(cuò)誤發(fā)生前写穴,有最后的機(jī)會(huì)響應(yīng)這個(gè)請(qǐng)求惰拱。

在 Objective-C 中如何實(shí)現(xiàn) KVO

注冊(cè)觀察者(注意:觀察者和被觀察者不會(huì)被保留也不會(huì)被釋放)

-?(void)addObserver:(NSObject?*)observer

forKeyPath:(NSString?*)keyPath

options:(NSKeyValueObservingOptions)options

context:(void?*)context;

接收變更通知

-?(void)observeValueForKeyPath:(NSString?*)keyPath

ofObject:(id)object

change:(NSDictionary?*)change

context:(void?*)context;

移除對(duì)象的觀察者身份

-?(void)removeObserver:(NSObject?*)observer

forKeyPath:(NSString?*)keyPath;

KVO中誰要監(jiān)聽誰注冊(cè)啊送,然后對(duì)響應(yīng)進(jìn)行處理欣孤,使得觀察者與被觀察者完全解耦。

KVO只檢測(cè)類中的屬性昔逗,并且屬性名都是通過NSString來查找降传,

編譯器不會(huì)檢錯(cuò)和補(bǔ)全勾怒,全部取決于自己。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笔链,一起剝皮案震驚了整個(gè)濱河市段只,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鉴扫,老刑警劉巖赞枕,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坪创,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡误堡,警方通過查閱死者的電腦和手機(jī)雏吭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門杖们,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悉抵,“玉大人摘完,你說我怎么就攤上這事⌒⒅危” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵岂座,是天一觀的道長(zhǎng)杭措。 經(jīng)常有香客問我,道長(zhǎng)手素,這世上最難降的妖魔是什么瘩蚪? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任疹瘦,我火速辦了婚禮,結(jié)果婚禮上拱礁,老公的妹妹穿的比我還像新娘辕漂。我一直安慰自己,他們只是感情好钉嘹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缨睡,像睡著了一般陈辱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沛贪,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音水评,去河邊找鬼媚送。 笑死中燥,一個(gè)胖子當(dāng)著我的面吹牛塘偎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咱扣,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼峰尝,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伦意,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤硼补,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后已骇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卵渴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年浪读,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碘橘。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吱肌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氮墨,到底是詐尸還是另有隱情,我是刑警寧澤犹撒,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布粒褒,位于F島的核電站诚镰,受9級(jí)特大地震影響奕坟,放射性物質(zhì)發(fā)生泄漏清笨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一苛萎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腌歉,春花似錦、人聲如沸翘盖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汰瘫。三九已至,卻和暖如春混弥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浙宜。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工蛹磺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人萤捆。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像市怎,于是被迫代替她去往敵國(guó)和親辛慰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子区匠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 鍵路徑 在一個(gè)給定的實(shí)體中,同一個(gè)屬性的所有值具有相同的數(shù)據(jù)類型位喂。 鍵-值編碼技術(shù)用于進(jìn)行這樣的查找—它是一種間接...
    輕皺眉頭淺憂思閱讀 6,116評(píng)論 0 5
  • OC的理解與特性 OC作為一門面向?qū)ο蟮恼Z言乱灵,自然具有面向?qū)ο蟮恼Z言特性:封裝、繼承阔蛉、多態(tài)。它既具有靜態(tài)語言的特性...
    克魯?shù)吕?/span>閱讀 447評(píng)論 0 0
  • 序言 目前形勢(shì)聋呢,參加到iOS隊(duì)伍的人是越來越多颠区,甚至已經(jīng)到供過于求了削锰。今年,找過工作人可能會(huì)更深刻地體會(huì)到今年的就...
    麥兜兜買兜兜閱讀 672評(píng)論 1 4
  • KVC(Key-value coding)鍵值編碼器贩,單看這個(gè)名字可能不太好理解朋截。其實(shí)翻譯一下就很簡(jiǎn)單了,就是指iO...
    朽木自雕也閱讀 1,552評(píng)論 6 1
  • 本文來自微信公眾號(hào)拆書幫(ID:chaishubang) 這是一個(gè)為了提高銷售團(tuán)隊(duì)凝聚力而組織的企業(yè)培訓(xùn)唆姐。 對(duì)我而...
    拆書幫閱讀 234評(píng)論 0 0