熟悉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; } 其實上面說的那兩對方法使用上基本是一樣的,只是valueForKeyPath的值是一個路徑(路徑之間以點號 . 分割),比如數(shù)據(jù)成員就是對象自己,尋值過程就會向下深入下去。 上述代碼說明了類的成員變量也可以使用基類NSObject的那兩對方法去訪問,不一定直接通過類實例訪問,但是這種方式還是有一定的風(fēng)險,具體危險情況請參考這個:http://www./2011/04/from_cpp_to_objc_20/ 比如說如下的一行KVC的代碼: [site setValue:@"sitename" forKey:@"name"]; SEL sel = sel_get_uid ("setValue:forKey:"); (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語言的)。 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)的兩個基本方法 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可以訪問所有方法。 |
|