KVO梳理與使用

一、概述

KVO全稱KeyValueObserving呢岗,是蘋果提供的一套事件通知機制本昏。允許對象監(jiān)聽另一個對象特定屬性的改變,并在改變時接收到事件痢缎。對于基本數(shù)據(jù)類型是觀察值的變化胁勺,但對于指針類型(OC中對象都是指針),是觀察指針的地址是否變化独旷。

二署穗、KVO使用三步驟

1.注冊觀察者

 - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;

2.監(jiān)聽方法,KVO會回調(diào)該方法方法來通知觀察者嵌洼。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
  1. 當(dāng)觀察者不需要監(jiān)聽時案疲,需要移除監(jiān)聽
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(nullable void *)context

三、解讀

1.注冊方法

  • observer:觀察者對象麻养,這個對象必須實現(xiàn)observeValueForKeyPath:ofObject:change:context:方法褐啡,以響應(yīng)屬性的修改通知。
  • keyPath:被監(jiān)聽的屬性鳖昌。這個值不能為nil春贸。
  • options:監(jiān)聽選項,參數(shù)是一個枚舉類型遗遵。
options 描述
NSKeyValueObservingOptionNew 提供屬性的新值
NSKeyValueObservingOptionOld 提供屬性的舊值
NSKeyValueObservingOptionInitial 觀察最初的值(在注冊觀察服務(wù)時會調(diào)用一次觸發(fā))
NSKeyValueObservingOptionPrior 分別在值修改前后觸發(fā)方法(即一次修改有兩次觸發(fā))
  • context:任意的額外數(shù)據(jù)萍恕,我們可以將這些數(shù)據(jù)作為上下文數(shù)據(jù),它會傳遞給觀察者對象的observeValueForKeyPath:ofObject:change:context:方法车要。

在調(diào)用addObserver方法后允粤,KVO并不會對觀察者進行強引用,所以需要注意觀察者的生命周期翼岁,否則會導(dǎo)致觀察者被釋放帶來的Crash类垫。

2. 監(jiān)聽方法

  • keyPath:即被觀察的屬性,與參數(shù)object相關(guān)琅坡。
  • object:keyPath所屬的對象悉患。
  • change:這是一個字典,它包含了屬性被修改的一些信息榆俺。這個字典中包含的值和我們在添加觀察者時設(shè)置的options參數(shù)相呼應(yīng)售躁。
  • context:這個值即是添加觀察者時傳遞的數(shù)據(jù)。

3. 調(diào)用方式
1.直接調(diào)用set方法茴晋,或者通過屬性的點語法間接調(diào)用
2.使用KVC的setValue:forKey:方法
3.需要注意:對于容器類陪捷,例如NSMutableArray在調(diào)用 addObject或removeObject 系列方法時,不會觸發(fā)KVO诺擅。為了實現(xiàn)容器類的 KVO市袖,官方為我們提供了如下方法:

- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key

通過對該方法返回的數(shù)組進行增刪操作可以觸發(fā)KVO。

為什么會這樣呢烁涌?

1.開頭筆者提到過苍碟,對于指針對象酒觅,KVO本質(zhì)上是監(jiān)聽指針的地址是否變化。
數(shù)組在調(diào)用它的 addObject微峰、removeObject 系列方法時阐滩,雖然數(shù)組內(nèi)部發(fā)生了變化,但是數(shù)組的地址并沒有改變县忌。所以掂榔,不會觸發(fā)KVO。
2.調(diào)用mutableArrayValueForKey這個方法症杏,會返回一個代理對象装获。(你可以理解為被觀察數(shù)組的深拷貝的對象)。至于深拷貝厉颤,淺拷貝的問題穴豫,筆者準備單獨展開一期進行論述。
3.當(dāng)對這個代理對象進行增刪等操作后逼友,會立刻對這個代理對象進行一次深拷貝精肃,并將源數(shù)組的指針指向這個新拷貝出來的數(shù)組。(可能有點繞帜乞,仔細縷一下)司抱。這樣被觀察的數(shù)組指針地址就發(fā)生了變化,從而觸發(fā)KVO黎烈。

最后提一下习柠,RAC的監(jiān)聽機制和KVO是一樣的。所以照棋,用RAC監(jiān)聽數(shù)組资溃,也可以采用這種方式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市烈炭,隨后出現(xiàn)的幾起案子溶锭,更是在濱河造成了極大的恐慌,老刑警劉巖符隙,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趴捅,死亡現(xiàn)場離奇詭異,居然都是意外死亡膏执,警方通過查閱死者的電腦和手機驻售,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門露久,熙熙樓的掌柜王于貴愁眉苦臉地迎上來更米,“玉大人,你說我怎么就攤上這事毫痕≌髀停” “怎么了迟几?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長栏笆。 經(jīng)常有香客問我类腮,道長,這世上最難降的妖魔是什么蛉加? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任蚜枢,我火速辦了婚禮,結(jié)果婚禮上针饥,老公的妹妹穿的比我還像新娘厂抽。我一直安慰自己,他們只是感情好丁眼,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布筷凤。 她就那樣靜靜地躺著,像睡著了一般苞七。 火紅的嫁衣襯著肌膚如雪藐守。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天蹂风,我揣著相機與錄音卢厂,去河邊找鬼。 笑死惠啄,一個胖子當(dāng)著我的面吹牛足淆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播礁阁,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼巧号,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了姥闭?” 一聲冷哼從身側(cè)響起丹鸿,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棚品,沒想到半個月后靠欢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡铜跑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年门怪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锅纺。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡掷空,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坦弟,我是刑警寧澤护锤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站酿傍,受9級特大地震影響烙懦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赤炒,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一氯析、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧莺褒,春花似錦魄鸦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至旷余,卻和暖如春绢记,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背正卧。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工蠢熄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炉旷。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓签孔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窘行。 傳聞我的和親對象是個殘疾皇子饥追,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344