一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

KVC / KVO / KVB 

 飛妳莫屬 2014-12-30

熟悉oc語法的同學(xué)也許都會懂得這么一點:在oc中,類的成員變量或是方法是沒有絕對私有的。

私有方法直接通過類實例無法訪問,但可以借助oc的“編譯運行時”機(jī)制,也即“瞎子摸黑”機(jī)制(個人理解:只要確定了該類有方法A,管你是私有共有,我用performSelector函數(shù)就能調(diào)用你),說到這,也許有同學(xué)會自然想起,那私有變量如何去訪問呢?貌似以前還真沒這樣搞過,然而現(xiàn)實是可以的,只不過一般我們把變量設(shè)為類的私有變量后是不希望自己或是其他人再去訪問的,不然我只能說你自己又在找賤了。。。。。。。。。。。。。。

好吧,言歸正傳,這篇文章主要是想介紹下oc中的KVC、KVO、KVB的實現(xiàn)機(jī)制,當(dāng)然跟我上面說的那些肯定是有關(guān)系的啦。。

1. KVC:  key-value coding(鍵值編碼)

它 是一種使用字符串標(biāo)識符,間接訪問對象屬性的機(jī)制,它是很多技術(shù)的基礎(chǔ)。主要的方法就兩對方法:(setValue:forKey,valueForKey)、setValue:forKeyPath,valueForKeyPath);這個東西有什么作用呢,我先不說原理,先說怎么用,例子如下:

@interface A { NSString* foo; }
 ... // 其它代碼
 @end
@interface B { NSString* bar; A* myA; }
 ... // 其它代碼
@end
@implementation B
... // 假設(shè) A 類型的對象 a,B 類型的對象
 b A* a = ...;
 B* b = ...;
 NSString* s1 = [a valueForKey:@"foo"]; // 正確
 NSString* s2 = [b valueForKey:@"bar"]; // 正確
 NSString* s3 = [b valueForKey:@"myA"]; // 正確
 NSString* s4 = [b valueForKeyPath:@"myA.foo"]; // 正確
 NSString* s5 = [b valueForKey:@"myA.foo"]; // 錯誤
 NSString* s6 = [b valueForKeyPath:@"bar"]; // 正確
 ...
@end

其實上面說的那兩對方法使用上基本是一樣的,只是valueForKeyPath的值是一個路徑(路徑之間以點號 . 分割),比如數(shù)據(jù)成員就是對象自己,尋值過程就會向下深入下去。
注意,這里的數(shù)據(jù)成員的名字都是使用的字符串的形式。這種使用方法的最好的用處在于將數(shù)據(jù)(名字)綁定到一些觸發(fā)器(尤其是方法調(diào)用)上,
例如鍵值對觀察(Key-Value Observing, KVO)等。

上述代碼說明了類的成員變量也可以使用基類NSObject的那兩對方法去訪問,不一定直接通過類實例訪問,但是這種方式還是有一定的風(fēng)險,具體危險情況請參考這個:http://www./2011/04/from_cpp_to_objc_20/
然后我再說下原理,是俺Copy過來的,大家觀賞下:
KVC運用了一個isa- swizzling技術(shù)。isa-swizzling就是類型混合指針機(jī)制。KVC主要通過isa- swizzling,來實現(xiàn)其內(nèi)部查找定位的。
isa指針,如其名稱所指,(就是is a kind of的意思),指向維護(hù)分發(fā)表的對象的類。該分發(fā)表實際上包含了指向?qū)崿F(xiàn)類中的方法的指針,和其它數(shù)據(jù)。

比如說如下的一行KVC的代碼:

[site setValue:@"sitename" forKey:@"name"];
就會被編譯器處理成:

SEL sel = sel_get_uid ("setValue:forKey:");
IMP method = objc_msg_lookup (site->isa,sel);
method(site, sel, @"sitename", @"name");
首先介紹兩個基本概念:

(1)SEL數(shù)據(jù)類型:它是編譯器運行Objective-C里的方法的環(huán)境參數(shù)。

(2)IMP數(shù)據(jù) 類型:他其實就是一個編譯器內(nèi)部實現(xiàn)時候的函數(shù)指針。當(dāng)Objective-C編譯器去處理實現(xiàn)一個方法的時候,就會指向一個IMP對象,這個對象是C語言表述的類型(事實上,在Objective-C的編譯器處理的時候,基本上都是C語言的)。
這下KVC內(nèi)部的實現(xiàn)就很清楚的清楚了:一個對象在調(diào)用setValue的時候,
(1)首先根據(jù)方法名找到運行方法的時候所需要的環(huán)境參 數(shù)。
(2)他會從自己isa指針結(jié)合環(huán)境參數(shù),找到具體的方法實現(xiàn)的接口。
(3)再直接查找得來的具體的方法實現(xiàn)。

2.KVO:  key-value observing(鍵值監(jiān)聽)與KVB: key-value Binding(鍵值綁定)

這兩個機(jī)制是結(jié)合起來使用的,分別說下,

Key-Value Observing (簡寫為KVO):當(dāng)指定的對象的屬性被修改了,允許對象接受到通知的機(jī)制。每次指定的被觀察對象的屬性被修改的時候,KVO都會自動的去通知相應(yīng)的觀察者。

KVO的優(yōu)點

當(dāng) 有屬性改變,KVO會提供自動的消息通知。這樣的架構(gòu)有很多好處。首先,開發(fā)人員不需要自己去實現(xiàn)這樣的方案:每次屬性改變了就發(fā)送消息通知。這是KVO機(jī)制提供的最大的優(yōu)點。因為這個方案已經(jīng)被明確定義,獲得框架級支持,可以方便地采用。開發(fā)人員不需要添加任何代碼,不需要設(shè)計自己的觀察者模型,直接可以在工程里使用。其次,KVO的架構(gòu)非常的強大,可以很容易的支持多個觀察者觀察同一個屬性,以及相關(guān)的值。

KVB實現(xiàn)的兩個基本方法
1:為對象添加觀察者OBserver  addObserver:forKeyPath:options:context:
2:觀察者OBserver收到信息的處理函數(shù)   observeValueForKeyPath:ofObject:change:context:

KVO和KVB最明顯的使用場景就是在一些界面實時顯示行很強的地方,比如股票走向、售票余額等,這種方式免去了我們自己操作通知的麻煩,想到這,我發(fā)現(xiàn)當(dāng)初點金和91市場中下載頁面進(jìn)度的顯示也完全可以采用這種方式。

先說到這兒吧,更精彩的待續(xù)。。。。。。。。

原英文鏈接:http:///2012/12/helper-classes-for-easy-cocoa-touch-key-value-observing-kvo-and-key-value-binding-kvb/

 

 

1、setValue:forKey: 可以訪問到setXXX:方法。

2、valueForKey:可以訪問到實例變量和不帶參數(shù)的方法。

3、performSelector可以訪問所有方法。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    日韩aa一区二区三区| 人人妻人人澡人人夜夜| 98精品永久免费视频| 成人精品一区二区三区综合| 伊人国产精选免费观看在线视频| 欧美一区二区黑人在线| 欧美日韩免费观看视频| 亚洲香艳网久久五月婷婷| 国产一级内片内射免费看| 国产黄色高清内射熟女视频| 日韩成人中文字幕在线一区| 日本在线视频播放91| 夫妻性生活黄色录像视频| 欧美自拍系列精品在线| 熟女免费视频一区二区| 东京不热免费观看日本| 国产综合一区二区三区av| 欧美又黑又粗大又硬又爽| 91亚洲精品亚洲国产| 欧美成人免费夜夜黄啪啪 | 亚洲黄色在线观看免费高清| 又大又长又粗又猛国产精品| 精品精品国产自在久久高清| 亚洲中文字幕高清乱码毛片| 91香蕉国产观看免费人人| 国产精品久久男人的天堂| 国产欧美另类激情久久久| 日本不卡在线一区二区三区| 国产成人亚洲欧美二区综| 老熟女露脸一二三四区| 日韩精品视频香蕉视频| 青青草草免费在线视频| 亚洲午夜精品视频观看| 少妇熟女亚洲色图av天堂| 亚洲欧美日韩在线看片| 九九热这里有精品20| 东京热加勒比一区二区三区| 欧美成人精品国产成人综合| 欧美日韩精品一区二区三区不卡| 午夜福利视频偷拍91| 久久一区内射污污内射亚洲|