KVC 與KVO

Key-Value Codin(KVC)

  • kvc即是指 NSKeyValueCoding耍目,一個非正式的 Protocol巫击,提供一種機(jī)制來間接訪問對象的屬性背镇。KVO 就是基于 KVC 實(shí)現(xiàn)的關(guān)鍵技術(shù)之一尘应。
    • 一個對象擁有某些屬性上渴。比如說,一個Person對象有一個name和一個address屬性.以KVC說法元暴,Person 對象分別有一個 value 對應(yīng)他的 name 和 address 的 key篷扩。 key 只是一個字符串,它對應(yīng)的值可以是任意類型的對象昨寞。從最基礎(chǔ)的層次上看瞻惋,KVC 有兩個方法:一個是設(shè)置 key 的值,另一個是獲取 key 的值援岩。如下面的例子:

void changeName(Person *p, NSString *newName)
{
// using the KVC accessor (getter) method
NSString *originalName = [p valueForKey:@"name"];
// using the KVC accessor (setter) method.
[p setValue:newName forKey:@"name"]
NSLog(@"Changed %@'s name to: %@", originalName, newName);
}

     - 現(xiàn)在,如果 Person 有另外一個 key 配偶(spouse)掏导,spouse 的 key 值是另一個 Person 對象享怀,用 KVC 可以這樣寫:
```objc
void logMarriage(Person *p)
{
    // just using the accessor again, same as example above
    NSString *personsName = [p valueForKey:@"name"];
    // this line is different, because it is using
    // a "key path" instead of a normal "key"
    NSString *spousesName = [p valueForKeyPath:@"spouse.name"];
    NSLog(@"%@ is happily married to %@", personsName, spousesName);
} 
 - key 與 key pat 要區(qū)分開來,key 可以從一個對象中獲取值趟咆,而 key path 可以將多個 key 用點(diǎn)號 “.” 分割連接起來添瓷,比如:

[p valueForKeyPath:@"spouse.name"];
相當(dāng)于這樣……
[[p valueForKey:@"spouse"] valueForKey:@"name"];
好了,以上是 KVC 的基本知識值纱,接著看看 KVO鳞贷。

Key-Value Observing (KVO)

Key-Value Observing (KVO) 建立在 KVC 之上,它能夠觀察一個對象的 KVC key path 值的變化虐唠。舉個例子搀愧,用代碼觀察一個 person 對象的 address 變化,以下是實(shí)現(xiàn)的三個方法:

  • watchPersonForChangeOfAddress: 實(shí)現(xiàn)觀察
  • observeValueForKeyPath:ofObject:change:context: 在被觀察的 key path 的值變化時調(diào)用
  • dealloc 停止觀察
-(void) watchPersonForChangeOfAddress:(Person *)p
{
    // this begins the observing
    [p addObserver:self
        forKeyPath:@"address"
           options:0
           context:KVO_CONTEXT_ADDRESS_CHANGED]; 
    // keep a record of all the people being observed,
    // because we need to stop observing them in dealloc
    [m_observedPeople addObject:p];
}
 (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context 
{
    // use the context to make sure this is a change in the address,
    // because we may also be observing other things
    if(context == KVO_CONTEXT_ADDRESS_CHANGED) {
        NSString *name = [object valueForKey:@"name"];
        NSString *address = [object valueForKey:@"address"];
        NSLog(@"%@ has a new address: %@", name, address);
    }
}
-(void) dealloc;
{
 
    // must stop observing everything before this object is
    // deallocated, otherwise it will cause crashes
    for(Person *p in m_observedPeople){
        [p removeObserver:self forKeyPath:@"address"];
    }
 
    [m_observedPeople release];
    m_observedPeople = nil;
 
    [super dealloc];
} 
(id) init;
{
    if(self = [super init]){
        m_observedPeople = [NSMutableArray new];
    }
 
    return self;
}

這就是 KVO 的作用疆偿,它通過 key path 觀察對象的值咱筛,當(dāng)值發(fā)生變化的時候會收到通知。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杆故,一起剝皮案震驚了整個濱河市迅箩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌处铛,老刑警劉巖饲趋,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異撤蟆,居然都是意外死亡奕塑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門枫疆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爵川,“玉大人,你說我怎么就攤上這事息楔∏薰保” “怎么了扒披?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長圃泡。 經(jīng)常有香客問我碟案,道長,這世上最難降的妖魔是什么颇蜡? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任价说,我火速辦了婚禮,結(jié)果婚禮上风秤,老公的妹妹穿的比我還像新娘鳖目。我一直安慰自己,他們只是感情好缤弦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布根时。 她就那樣靜靜地躺著茂浮,像睡著了一般岁钓。 火紅的嫁衣襯著肌膚如雪激涤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天累提,我揣著相機(jī)與錄音尘喝,去河邊找鬼。 笑死斋陪,一個胖子當(dāng)著我的面吹牛朽褪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鳍贾,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鞍匾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了骑科?” 一聲冷哼從身側(cè)響起橡淑,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咆爽,沒想到半個月后梁棠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斗埂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年符糊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呛凶。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡男娄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情模闲,我是刑警寧澤建瘫,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站尸折,受9級特大地震影響啰脚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜实夹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一橄浓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧亮航,春花似錦荸实、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宴猾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叼旋,已是汗流浹背仇哆。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夫植,地道東北人讹剔。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像详民,于是被迫代替她去往敵國和親延欠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

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

  • KVC 與 KVO 是 Objective C 的關(guān)鍵概念沈跨,個人認(rèn)為必須理解的東西由捎,下面是實(shí)例講解。 Key-Va...
    韓七夏閱讀 235評論 0 1
  • KVC 與 KVO 是 Objective C 的關(guān)鍵概念饿凛,個人認(rèn)為必須理解的東西狞玛,下面是實(shí)例講解。 (一)Key...
    Asserts閱讀 231評論 0 0
  • 原路徑:https://magicalboy.com/kvc_and_kvo/KVC 與 KVO 是 Object...
    擇一城終老_蝸牛閱讀 153評論 0 0
  • Key-Value Coding (KVC) KVC涧窒,即是指 NSKeyValueCoding心肪,一個非正式的 Pr...
    三歲就很乖閱讀 214評論 0 0
  • KVC 與 KVO 是 Objective C 的關(guān)鍵概念,個人認(rèn)為必須理解的東西纠吴,下面是實(shí)例講解硬鞍。 其他相關(guān)文章...
    火星抄手閱讀 304評論 0 2