iOS KVO

什么是KVO

  • KVO俗稱“鍵值監(jiān)聽”典尾,用來監(jiān)聽某個(gè)對(duì)象屬性值的改變

KVO的使用

- (void)viewDidLoad {
    [super viewDidLoad];
    self.person1 = [[GMPerson alloc] init];
    self.person1.height = 160;
    self.person1.name = @"GM";
    
    NSKeyValueObservingOptions option = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;
    /**
     * Observer: 觀察者
     * forKeyPath: 需要觀察的屬性
     * options: 有4個(gè)值 分別是:
     *    NSKeyValueObservingOptionNew 更改后的值篙顺,提供給處理方法
     *    NSKeyValueObservingOptionOld 更改前的值滑燃,提供給處理方法
     *    NSKeyValueObservingOptionInitial 把初始化的值提供給處理方法头镊,一旦注冊(cè)毛好,立馬就會(huì)調(diào)用一次。通常它會(huì)帶有新值躏救,而不會(huì)帶有舊值
     *    NSKeyValueObservingOptionPrior 分2次調(diào)用唯笙。在值改變之前和值改變之后
     * context: 可以帶入一些自定義參數(shù)
     */
    [self.person1 addObserver:self forKeyPath:@"name" options:option context:@"123"];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//    self.person1.height = 175;
    self.person1.name = @"GMhaha";
}
- (void)dealloc{
    [self.person1 removeObserver:self forKeyPath:@"name"];
}

/** 監(jiān)聽當(dāng)前對(duì)象屬性值發(fā)生改變時(shí)會(huì)調(diào)用 */
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
    
    NSLog(@"監(jiān)聽到了%@的屬性值%@ 改變了 -  %@  自定義參數(shù) - %@",object,keyPath,change,context);
}

KVO 本質(zhì)

在給某個(gè)對(duì)象添加KVO監(jiān)聽時(shí),程序會(huì)使用Runtime動(dòng)態(tài)創(chuàng)建一個(gè)類盒使,例如:以上代碼崩掘,我們要給 self.person1 這個(gè)對(duì)象添加KVO,在注冊(cè)監(jiān)聽時(shí)少办,系統(tǒng)會(huì)使用Runtime動(dòng)態(tài)的創(chuàng)建一個(gè)GMPerson的子類 NSKVONotifying_GMPerson苞慢。self.person1 這個(gè)對(duì)象的isa指針,指向 NSKVONotifying_GMPerson 這個(gè)子類英妓,在我們改變person1里面的屬性值時(shí)挽放,會(huì)調(diào)用 NSKVONotifying_GMPerson 這個(gè)子類里的 set方法。NSKVONotifying_GMPerson 類里的set方法會(huì)調(diào)用Foundation框架里的 _NSSetIntValueAndNotify(根據(jù)具體屬性類型調(diào)用蔓纠。比如:float 類型會(huì)調(diào)用_NSSetFloatValueAndNotify) 這個(gè)C語言方法 這個(gè)方法里面實(shí)際上又調(diào)用了 willChangeValueForKey辑畦、set方法、didChangeValueForKey 方法腿倚,didChangeValueForKey方法里實(shí)際上是調(diào)用了通知監(jiān)聽器的方法纯出。

NSKVONotifying_GMPerson 類具體實(shí)現(xiàn)的偽代碼如下:

//
//  NSKVONotifying_GMPerson.m
//  KVO
//
//  Created by G_M on 2022/2/10.
//

#import "NSKVONotifying_GMPerson.h"

@implementation NSKVONotifying_GMPerson

- (void)setHeight:(int)height{
    _NSSetIntValueAndNotify();
}

/** 偽代碼,具體實(shí)現(xiàn)蘋果未開源 */
void _NSSetIntValueAndNotify(){
    [self willChangeValueForKey:@"height"];
    [super setHeight:height];
    [self didChangeValueForKey:@"height"];
}

- (void)didChangeValueForKey:(NSString *)key{
    /** 通知監(jiān)聽器敷燎,某屬性的key值發(fā)生了改變 */
    [oberser observeValueForKeyPath:key ofObject:self change:nil context:nil];
}

@end

這些都是蘋果動(dòng)態(tài)生成的暂筝,并不需要我們自己編寫,寫出來只是為了幫助理解KVO的本質(zhì)懈叹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乖杠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子澄成,更是在濱河造成了極大的恐慌胧洒,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墨状,死亡現(xiàn)場離奇詭異卫漫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)肾砂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門列赎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人镐确,你說我怎么就攤上這事包吝”罚” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵诗越,是天一觀的道長砖瞧。 經(jīng)常有香客問我,道長嚷狞,這世上最難降的妖魔是什么块促? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮床未,結(jié)果婚禮上竭翠,老公的妹妹穿的比我還像新娘。我一直安慰自己薇搁,他們只是感情好斋扰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著只酥,像睡著了一般褥实。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上裂允,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音哥艇,去河邊找鬼绝编。 笑死,一個(gè)胖子當(dāng)著我的面吹牛貌踏,可吹牛的內(nèi)容都是我干的十饥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼祖乳,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼逗堵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起眷昆,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤蜒秤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后亚斋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體作媚,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年帅刊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纸泡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赖瞒,死狀恐怖女揭,靈堂內(nèi)的尸體忽然破棺而出蚤假,到底是詐尸還是另有隱情,我是刑警寧澤吧兔,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布勤哗,位于F島的核電站,受9級(jí)特大地震影響掩驱,放射性物質(zhì)發(fā)生泄漏芒划。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一欧穴、第九天 我趴在偏房一處隱蔽的房頂上張望民逼。 院中可真熱鬧,春花似錦涮帘、人聲如沸拼苍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疮鲫。三九已至,卻和暖如春弦叶,著一層夾襖步出監(jiān)牢的瞬間俊犯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工伤哺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留燕侠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓立莉,卻偏偏與公主長得像绢彤,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜓耻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • KVO KVO的全稱是Key-Value-Observing,俗稱“鍵值監(jiān)聽”茫舶,可以用于監(jiān)聽某個(gè)對(duì)象屬性的改變。 ...
    天空像天空一樣藍(lán)閱讀 369評(píng)論 0 5
  • 面試題問題一:iOS用什么方式實(shí)現(xiàn)對(duì)一個(gè)對(duì)象的KVO刹淌?(KVO的本質(zhì)是什么饶氏?)問題二:如何手動(dòng)觸發(fā)KVO?(就算沒...
    蔣斌文閱讀 478評(píng)論 0 3
  • 【一】 KVO過程: 1芦鳍、新建了一個(gè)Person類嚷往,包含一個(gè)garde屬性 2、在需要檢測改屬性變化的地方添加監(jiān)聽...
    xiaofengl閱讀 866評(píng)論 1 2
  • 1. KVO 一.KVO原理的使用與證明 我們?cè)陂_發(fā)的過程中經(jīng)常使用KVO和KVC,但是我們并不了解其底層原理和功...
    周灬閱讀 835評(píng)論 0 9
  • KVO全稱為Key Value Observing柠衅,鍵值監(jiān)聽機(jī)制皮仁,由NSKeyValueObserving協(xié)議提供...
    木子雨廷t閱讀 531評(píng)論 0 7