iOS_模擬KVO的底層實(shí)現(xiàn)、手動(dòng)實(shí)現(xiàn)KVO

一放仗、回顧系統(tǒng)的KVO是怎么實(shí)現(xiàn)監(jiān)聽的

#1. 實(shí)例化一個(gè)類
 Person *person = [[Person alloc] init];
 person.age = 11;

#2. 開始監(jiān)聽
[person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];

#3. 值改變時(shí)(age = 111)润绎,監(jiān)聽執(zhí)行的方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{

     NSLog(@"person 的值變了:%d",_person.age);
}

我們既然要手動(dòng)寫一個(gè)KVO,那么就要自己寫一個(gè)API诞挨,讓person調(diào)嘍莉撇,還有一個(gè)就是值發(fā)生變化,也會(huì)調(diào)一個(gè)我們自己的API嘍惶傻,例如:ml_observer棍郎,具體請看下面

二、手動(dòng)做咱們自己的KVO
****核心步驟如下:****
一)银室、生成一個(gè)Person類的派生類 Person_KVO涂佃。
二)静秆、使當(dāng)前對(duì)象的isa指向新的派生類,就會(huì)調(diào)用派生類的set方法巡李。
三)抚笔、重寫Person_KVO的setAge方法,在set方法中拿到觀察者(使用運(yùn)行時(shí)關(guān)聯(lián)觀察者這個(gè)屬性)侨拦。
四)殊橙、每次重寫setAge方法,都調(diào)用觀察者的ml_observeValueForKeyPath方法狱从。實(shí)現(xiàn)時(shí)刻監(jiān)聽膨蛮。

****代碼如下:****
ViewController.h

Person *person = [[Person alloc] init];

_person = person;

#調(diào)用手寫KVO開始監(jiān)聽方法
[person ml_addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];

# 監(jiān)聽方法  (驗(yàn)證手寫KVO是否成功)
- (void)ml_observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{

    NSLog(@"person 的值變了:%d",_person.age);
}

NSObject+KVO.h

- (void)ml_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context{

    //修改isa指針,就是把`當(dāng)前對(duì)象`指向一個(gè)`新類`
    // Person's isa ->  Person_KVO
    // Class object_setClass(id obj, Class cls)
    //使當(dāng)前對(duì)象的isa指向新的派生類(Person_KVO)季研,就會(huì)調(diào)用派生類的set方法
    object_setClass(self, [Person_KVO class]);

    //給對(duì)象綁定觀察者對(duì)象
    objc_setAssociatedObject(self, @"observer", observer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

Person_KVO.h

-(void)setAge:(int)age{ [super setAge:age]; //修改了子類的值后敞葛,父類的值也修改了 
//調(diào)用KVO
 //獲取觀察者 
id observer = objc_getAssociatedObject(self, @"observer"); 
//調(diào)用觀察者的方法 
//就是驗(yàn)證手寫KVO的方法 observer其實(shí)就是VC
 [observer ml_observeValueForKeyPath:@"age" ofObject:self change:nil context:nil];
}

PS:該代碼僅僅是模擬KVO的底層實(shí)現(xiàn)流程,主要注重流程与涡,具體的什么參數(shù)如觀察新值惹谐、舊值,沒有做驼卖,有強(qiáng)迫癥的朋友有興趣可以設(shè)置個(gè)枚舉即可氨肌!

三、流程圖

795875-63631d06f874e17b.png.jpeg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酌畜,一起剝皮案震驚了整個(gè)濱河市怎囚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌桥胞,老刑警劉巖恳守,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贩虾,居然都是意外死亡催烘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門整胃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颗圣,“玉大人喳钟,你說我怎么就攤上這事屁使。” “怎么了奔则?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蛮寂,是天一觀的道長。 經(jīng)常有香客問我易茬,道長酬蹋,這世上最難降的妖魔是什么及老? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮范抓,結(jié)果婚禮上骄恶,老公的妹妹穿的比我還像新娘。我一直安慰自己匕垫,他們只是感情好僧鲁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著象泵,像睡著了一般寞秃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上偶惠,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天春寿,我揣著相機(jī)與錄音,去河邊找鬼忽孽。 笑死绑改,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的兄一。 我是一名探鬼主播绢淀,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瘾腰!你這毒婦竟也來了皆的?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤蹋盆,失蹤者是張志新(化名)和其女友劉穎费薄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栖雾,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡楞抡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了析藕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片召廷。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖账胧,靈堂內(nèi)的尸體忽然破棺而出竞慢,到底是詐尸還是另有隱情,我是刑警寧澤治泥,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布筹煮,位于F島的核電站,受9級(jí)特大地震影響居夹,放射性物質(zhì)發(fā)生泄漏败潦。R本人自食惡果不足惜本冲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劫扒。 院中可真熱鬧檬洞,春花似錦、人聲如沸沟饥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闷板。三九已至澎灸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間遮晚,已是汗流浹背性昭。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留县遣,地道東北人糜颠。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像萧求,于是被迫代替她去往敵國和親其兴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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

  • 持續(xù)寫作第3天 (一) 好餓啊…身上只剩下幾十塊了。我已經(jīng)堅(jiān)持半年了…再咬咬牙守问,再加把勁匀归!就當(dāng)減肥吧! 蘇菲耗帕,23...
    曼曼的世界閱讀 435評(píng)論 4 2
  • 2017/8/23【能量世界1085天】 在拜訪客戶的路上仿便,因?yàn)楹筒úㄅ浜系貌诲e(cuò)体啰。我一得意,說出了一些飄飄然的話嗽仪,...
    陳艷霞小樹媽閱讀 157評(píng)論 0 0
  • 我向誰去訴說我的悲傷…… 暮色昏暗荒勇。大片的濕雪繞著剛點(diǎn)亮的街燈懶洋洋地飄飛,落在房頂钦幔、馬背枕屉、肩膀、帽子上鲤氢,積成又軟...
    簡書茶館葉老板閱讀 2,098評(píng)論 17 44
  • 蕭敬騰在《我的大學(xué)》里唱道:“考了那么多的試搀擂,沒想到是為了離開家,故鄉(xiāng)沒有春和秋卷玉,只剩下匆匆來去冬夏……” 我深以...
    流沙祭年華閱讀 445評(píng)論 2 9
  • 有人說,腦電波是個(gè)很神奇的東西寝并。 他與她箫措,生死之間,因?yàn)槟X電波衬潦,再?zèng)]有生死相隔之說 爺爺走了 我 好像也走了 在街...
    WuHAIXIN_閱讀 386評(píng)論 0 0