日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

KVO和KVC简介

發(fā)布時(shí)間:2024/7/23 c/c++ 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 KVO和KVC简介 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、Key-Value-Observing--KVO(鍵值觀察者模式)(1)簡介:此機(jī)制可以在一個(gè)類中監(jiān)聽另外一個(gè)類的屬性變化,包括我們自己的類和已有的Cocoa類庫中的類。當(dāng)被監(jiān)聽的類的屬性發(fā)生了變化時(shí),觀察者會(huì)收到通知,可以針對(duì)屬性變化添加自己的動(dòng)作。(2)為被監(jiān)聽對(duì)象注冊觀察者:指定觀察者,要觀察的屬性的名稱,options可以傳0值。– addObserver:forKeyPath:options:context:(3)觀察者實(shí)現(xiàn)通知接收函數(shù):– observeValueForKeyPath:ofObject:change:context:(4)在不需要觀察者或者觀察者銷毀前移除觀察者:– removeObserver:forKeyPath:context:(5)當(dāng)被監(jiān)聽的對(duì)象的對(duì)應(yīng)key值發(fā)生更改時(shí),觀察者會(huì)收到通知,比如給屬性直接賦值,后者調(diào)用-setValue:forKey:方法。
二、KVO的通知觸發(fā)方式:(1)在觀察者類中實(shí)現(xiàn)+ automaticallyNotifiesObserversForKey:方法,當(dāng)返回YES時(shí),該key會(huì)在值發(fā)生改變時(shí)自動(dòng)觸發(fā)通知,如果返回NO,需要手動(dòng)觸發(fā)通知,在值改變前后加如下方法:– willChangeValueForKey: ? ?– didChangeValueForKey:(2)是自動(dòng)還是手動(dòng),根據(jù)實(shí)際情況定,默認(rèn)是自動(dòng)的。(3)當(dāng)直接賦值時(shí),要加上對(duì)象,如當(dāng)前對(duì)象的屬性改變時(shí)要加self,否則不觸發(fā)通知,需要手動(dòng)觸發(fā)。
三、KVO 依賴鍵

有時(shí)候一個(gè)屬性的值依賴于其他屬性值,那么如果其他屬性值發(fā)生變更,那么必然也就導(dǎo)致該屬性值的變更,也即 Dependent Poroperties。在KVO中,引入了依賴鍵

在KVO中,提供了如下兩種實(shí)現(xiàn) 依賴鍵 的方法:

[cpp]?view plain?copy?
  • +?(NSSet?*)keyPathsForValuesAffectingValueForKey:(NSString?*)key????
  • ????
  • +?(NSSet?*)keyPathsForValuesAffecting<Key> ??
  • 例如,information 屬性依賴于 target 的 age 和 grade 屬性,target 的 age/grade 屬性任一發(fā)生變化,information 的觀察者都會(huì)得到通知。

    [cpp]?view plain?copy?
  • +?(NSSet?*)keyPathsForValuesAffectingInformation????
  • {????
  • ????NSSet?*?keyPaths?=?[NSSet?setWithObjects:@"target.age",?@"target.grade",?nil];????
  • ????return?keyPaths;????
  • }????
  • ????
  • +?(NSSet?*)keyPathsForValuesAffectingValueForKey:(NSString?*)key????
  • {????
  • ????NSSet?*?keyPaths?=?[super?keyPathsForValuesAffectingValueForKey:key];????
  • ????NSArray?*?moreKeyPaths?=?nil;????
  • ????????
  • ????if?([key?isEqualToString:@"information"])????
  • ????{????
  • ????????moreKeyPaths?=?[NSArray?arrayWithObjects:@"target.age",?@"target.grade",?nil];????
  • ????}????
  • ????????
  • ????if?(moreKeyPaths)????
  • ????{????
  • ????????keyPaths?=?[keyPaths?setByAddingObjectsFromArray:moreKeyPaths];????
  • ????}????
  • ????????
  • ????return?keyPaths;????
  • } ??
  • 要實(shí)現(xiàn)?keyPathsForValuesAffectingInformation??或?keyPathsForValuesAffectingValueForKey: 方法是告訴系統(tǒng) information 屬性依賴于哪些其他屬性,這兩個(gè)方法都返回一個(gè)key-path 的集合。


    如果選擇實(shí)現(xiàn)?keyPathsForValuesAffectingValueForKey,要先獲取 super 返回的結(jié)果 set,然后判斷 key 是不是目標(biāo) key,如果是就將依賴屬性的 key-path 結(jié)合追加到 super 返回的結(jié)果 set 中,否則直接返回 super的結(jié)果。

    注:顯然前者實(shí)現(xiàn)過程簡單。


    四、Key-Value-Coding--KVC(鍵值編碼)(1)該機(jī)制會(huì)把類的屬性作為一個(gè)key處理。(2)取值:[object valueForKey:@"key"];? ? 設(shè)值:[object setValue:@"value" forKey:@"key"];(3)KVO是基于KVC實(shí)現(xiàn)的。

    總結(jié)

    以上是生活随笔為你收集整理的KVO和KVC简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。