談?wù)勀銓VO和KVC的理解

KVO

KVO(Key-Value-Observing):翻譯成鍵值觀察茂装。它是一種觀察者模式的衍生其馏。其基本思想是剧蹂,對目標(biāo)對象的某屬性添加觀察,當(dāng)該屬性發(fā)生變化時,通過觸發(fā)觀察者對象實現(xiàn)的KVO接口方法执桌,來自動的通知觀察者鄙皇。

KVO是觀察者模式的另一實現(xiàn),使用了isa混寫(isa-swizzling)來實現(xiàn)KVO仰挣。

KVO底層實現(xiàn):

當(dāng)某個類的對象第一次被觀察時伴逸,系統(tǒng)就會在運行時動態(tài)地創(chuàng)建該類的一個派生類,在這個派生類中重寫原類中被觀察屬性的setter方法,派生類在被重寫的setter方法實現(xiàn)真正的通知機制(Person->NSKVONotifying_Person). 派生類重寫了 class 方法以“欺騙”外部調(diào)用者它就是起初的那個類膘壶。然后系統(tǒng)將這個對象的 isa指針指向這個新誕生的派生類错蝴,因此這個對象就成為該派生類的對象了,因而在該對象上對 setter的調(diào)用就會調(diào)用重寫的setter颓芭,從而激活鍵值通知機制顷锰。此外,派生類還重寫了dealloc 方法來釋放資源亡问。


KVO的使用場景:

?1.實現(xiàn)上下拉刷新控件?content offset

?2.webview混合排版?content size

?3.監(jiān)聽模型屬性實時更新UI

KVO總結(jié)

1.動態(tài)創(chuàng)建Person的子類使用

2.子類重寫setName

3.動態(tài)修改了對象的類型

4.還了解到了,KVO不僅可以調(diào)用setter方法,還可以調(diào)用插入,刪除,代替方法.通過對kvo的進一步了解,我們是很清楚KVO底層運用.

KVO與Notification之間的區(qū)別:

notification是需要一個發(fā)送notification的對象官紫,一般是notificationCenter,來通知觀察者州藕。

KVO是直接通知到觀察對象束世,并且邏輯非常清晰,實現(xiàn)步驟簡單床玻。

KVC

KVC(Key-value coding)鍵值編碼良狈,就是指iOS的開發(fā)中,可以允許開發(fā)者通過Key名直接訪問對象的屬性笨枯,或者給對象的屬性賦值薪丁。而不需要調(diào)用明確的存取方法。這樣就可以在運行時動態(tài)地訪問和修改對象的屬性馅精。而不是在編譯時確定严嗜,這也是iOS開發(fā)中的黑魔法之一。很多高級的iOS開發(fā)技巧都是基于KVC實現(xiàn)的洲敢。

KVC底層實現(xiàn):

(1.)KVC取值:

1.首先按get<Key>,<key>,is<Key>的順序方法查找getter方法漫玄,找到的話會直接調(diào)用。如果是BOOL或者Int等值類型压彭, 會將其包裝成一個NSNumber對象睦优。

2.如果上面的getter沒有找到,KVC則會查找countOf<Key>,objectIn<Key>AtIndex或<Key>AtIndexes格式的方法壮不。如果countOf<Key>方法和另外兩個方法中的一個被找到汗盘,那么就會返回一個可以響應(yīng)NSArray所有方法的代理集合(它是NSKeyValueArray,是NSArray的子類)询一,調(diào)用這個代理集合的方法隐孽,或者說給這個代理集合發(fā)送屬于NSArray的方法癌椿,就會以countOf<Key>,objectIn<Key>AtIndex或<Key>AtIndexes這幾個方法組合的形式調(diào)用。還有一個可選的get<Key>:range:方法菱阵。所以你想重新定義KVC的一些功能踢俄,你可以添加這些方法,需要注意的是你的方法名要符合KVC的標(biāo)準命名方法晴及,包括方法簽名都办。

3.如果上面的方法沒有找到,那么會同時查找countOf虑稼,enumeratorOf,memberOf格式的方法脆丁。如果這三個方法都找到,那么就返回一個可以響應(yīng)NSSet所的方法的代理集合动雹,和上面一樣槽卫,給這個代理集合發(fā)NSSet的消息,就會以countOf胰蝠,enumeratorOf,memberOf組合的形式調(diào)用歼培。

4.如果還沒有找到,再檢查類方法+(BOOL)accessInstanceVariablesDirectly,如果返回YES(默認行為)茸塞,那么和先前的設(shè)值一樣躲庄,會按_,_is,,is的順序搜索成員變量名,這里不推薦這么做钾虐,因為這樣直接訪問實例變量破壞了封裝性噪窘,使代碼更脆弱。如果重寫了類方法+(BOOL)accessInstanceVariablesDirectly返回NO的話效扫,那么會直接調(diào)用valueForUndefinedKey:方法倔监,默認是拋出異常。

(2.)KVC設(shè)值:

1.程序優(yōu)先調(diào)用set<Key>:屬性值方法菌仁,代碼通過setter方法完成設(shè)置

2.如果沒有找到setName:方法浩习,KVC機制會檢查+(BOOL)accessInstanceVariablesDirectly方法

3.如果該類即沒有set<key>:方法,也沒有_<key>成員變量济丘,KVC機制會搜索_is<Key>的成員變量谱秽。

4.和上面一樣,如果該類即沒有set<Key>:方法摹迷,也沒有_<key>和_is<Key>成員變量疟赊,KVC機制再會繼續(xù)搜索<key>和is<Key>的成員變量。再給它們賦值峡碉。

5.如果上面列出的方法或者成員變量都不存在近哟,系統(tǒng)將會執(zhí)行該對象的setValue:forUndefinedKey:方法,默認是拋出異常异赫。

KVC的使用場景:

1.KVC設(shè)值

2.KVC取值

3.KVC使用keyPath

4.KVC處理異常

5.KVC處理數(shù)值和結(jié)構(gòu)體類型屬性

6.KVC鍵值驗證(Key-Value Validation)

7.KVC處理集合

8.KVC處理字典

歡迎大家指出文中的錯誤椅挣!

也歡迎大家指出文中的不足!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末塔拳,一起剝皮案震驚了整個濱河市鼠证,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌靠抑,老刑警劉巖量九,帶你破解...
    沈念sama閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異颂碧,居然都是意外死亡荠列,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進店門载城,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肌似,“玉大人,你說我怎么就攤上這事诉瓦〈ǘ樱” “怎么了?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵睬澡,是天一觀的道長固额。 經(jīng)常有香客問我,道長煞聪,這世上最難降的妖魔是什么斗躏? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮昔脯,結(jié)果婚禮上啄糙,老公的妹妹穿的比我還像新娘。我一直安慰自己云稚,他們只是感情好迈套,可當(dāng)我...
    茶點故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碱鳞,像睡著了一般桑李。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窿给,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天贵白,我揣著相機與錄音,去河邊找鬼崩泡。 笑死禁荒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的角撞。 我是一名探鬼主播呛伴,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼勃痴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了热康?” 一聲冷哼從身側(cè)響起沛申,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姐军,沒想到半個月后铁材,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡奕锌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年著觉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惊暴。...
    茶點故事閱讀 40,435評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡饼丘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辽话,到底是詐尸還是另有隱情葬毫,我是刑警寧澤,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布屡穗,位于F島的核電站贴捡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏村砂。R本人自食惡果不足惜烂斋,卻給世界環(huán)境...
    茶點故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望础废。 院中可真熱鬧汛骂,春花似錦、人聲如沸评腺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒿讥。三九已至蝶念,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芋绸,已是汗流浹背媒殉。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摔敛,地道東北人廷蓉。 一個月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像马昙,于是被迫代替她去往敵國和親桃犬。 傳聞我的和親對象是個殘疾皇子刹悴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,442評論 2 359

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,111評論 1 32
  • KVC 什么是 KVC KVC 是 Key-Value-Coding 的簡稱。 KVC 是一種可以直接通過字符串的...
    LeeJay閱讀 2,208評論 6 41
  • KVC 什么是KVC KVC是Key-Value-Coding 的簡稱攒暇。 KVC是一種可以直接通過字符串的名字ke...
    Jack_deng閱讀 1,059評論 0 0
  • 最近發(fā)現(xiàn)之前看的東西沒一會就忘記了土匀,所以寫來好一些,也建議大家吧學(xué)到了記錄下來這樣加深印象扯饶,也可以幫助到別人恒削。首先...
    _技術(shù)支持閱讀 929評論 1 1
  • 面試題參考1 : 面試題[http://www.cocoachina.com/ios/20150803/12872...
    江河_ios閱讀 1,743評論 0 4