一、前言
KVO(Key-value observing)鍵值編碼拍冠,是Objective-C對(duì)觀察者設(shè)計(jì)模式的又一實(shí)現(xiàn)职抡,系統(tǒng)利用了指針混寫技術(shù)(isa-swizzing)來實(shí)現(xiàn)KVO
二、常用的方法說明
// 注冊(cè)O(shè)bserver: observer:觀察者, keyPath:要觀察的屬性名稱, options:對(duì)KVO機(jī)制進(jìn)行配置, context: 傳入任意類型的對(duì)象
addObserver:forKeyPath:options:context:
// 接收通知: keyPath:被監(jiān)聽的對(duì)象的屬性,object:被監(jiān)聽的對(duì)象埋凯,change:被監(jiān)聽的對(duì)象的屬性值的變化,是一個(gè)字典,
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
// 移除觀察者
-removeObserver:forKeyPath:
// 自動(dòng)開關(guān)
+ (BOOL) automaticallyNotifiesObserversOfSteps
// 組合監(jiān)聽key值
+ (NSSet<NSString *> *)keyPathsForValuesAffectingValueForKey:(NSString *)key
三雾棺、底層原理
- 當(dāng)一個(gè)對(duì)象使用了KVO監(jiān)聽,iOS系統(tǒng)會(huì)修改這個(gè)對(duì)象的isa指針衬浑,改為指向一個(gè)全新的通過Runtime動(dòng)態(tài)創(chuàng)建的子類
NSKVONotifying_xxx
- 然后動(dòng)態(tài)添加
setter
方法 - 動(dòng)態(tài)添加
class
方法 - 動(dòng)態(tài)添加
dealloc
方法 - 開啟手動(dòng)觀察捌浩,在setter方法前后調(diào)用
willChangeValueForKey
和didChangeValueForKey
方法 - 消息轉(zhuǎn)發(fā)給原類 newValue
- 消息發(fā)送-響應(yīng)回調(diào)方法
四、總結(jié)
- 使用
setter
方法改變值KVO才會(huì)生效 - 使用
setValue:forKey:
改變值KVO才會(huì)生效 - 成員變量直接修改需手動(dòng)添加KVO才會(huì)生效
//直接為成員變量賦值
[self willChangeValueForKey:@"value"];
_value += 1;
[self didChangeValueForKey:@"value"];