KVC闪金、KVO探識(六)KVO底層實現(xiàn)原理

前言

KVO的用法前面已經講過了疯溺,不懂得可以去看我的KVC、KVO探識(一),希望會對你有幫助囱嫩。今天主要講KVC嗅辣、KVO的底層實現(xiàn)……因為之前我也不懂,所以很有必要記錄一下挠说。

準備工作

KVO是基于觀察者設計模式來實現(xiàn)的澡谭。
觀察者模式:一個目標對象管理所有依賴于它的觀察者對象,并在它自身的狀態(tài)改變時主動通知觀察者對象损俭。這個主動通知通常是通過調用各觀察者對象所提供的接口方法來實現(xiàn)的蛙奖。觀察者模式較完美地將目標對象與觀察者對象解耦。

手動實現(xiàn)鍵值觀察(代碼示例)

被觀察的對象Target(重寫setter/getter方法)
Target.h

@interface Target : NSObject
{
   int age;
}
// for manual KVO 
- age- (int) age;
- (void) setAge:(int)theAge;
@end

Target.m

@implementation Target
- (id) init{ 
    self = [super init]; 
    if (nil != self) { 
          age = 10; 
     } 
    return self;
}
// for manual KVO - age
- (int) age{
    return age;
}
- (void) setAge:(int)theAge{ 
    [self willChangeValueForKey:@"age"];
    age = theAge; 
    [self didChangeValueForKey:@"age"];
}
+ (BOOL) automaticallyNotifiesObserversForKey:(NSString *)key { 
    if ([key isEqualToString:@"age"]) {
     return NO;
 } 
return [super automaticallyNotifiesObserversForKey:key]**;
}
@end

首先杆兵,需要手動實現(xiàn)屬性的 setter 方法雁仲,并在設置操作的前后分別調用 **willChangeValueForKey: **和 didChangeValueForKey方法,這兩個方法用于通知系統(tǒng)該 key 的屬性值即將和已經變更了琐脏;
其次攒砖,要實現(xiàn)類方法 automaticallyNotifiesObserversForKey,并在其中設置對該 key 不自動發(fā)送通知(返回 NO 即可)日裙。這里要注意吹艇,對其它非手動實現(xiàn)的 key,要轉交給 super 來處理昂拂。

實現(xiàn)原理

KVO的實現(xiàn)是基于runtime運行時的受神,下面就來詳細介紹一下原理:還是這張圖:


1678515-21e42e5bd141b750.png
  • 當某個類的對象第一次被觀察時,系統(tǒng)就會在運行期動態(tài)地創(chuàng)建該類的一個派生類格侯,在這個派生類中重寫基類中任何被觀察屬性的 setter 方法鼻听。
  • 派生類在被重寫的 setter 方法中實現(xiàn)真正的通知機制,就如前面手動實現(xiàn)鍵值觀察那樣联四。這么做是基于設置屬性會調用 setter 方法撑碴,而通過重寫就獲得了 KVO 需要的通知機制。當然前提是要通過遵循 KVO 的屬性設置方式來變更屬性值朝墩,如果僅是直接修改屬性對應的成員變量醉拓,是無法實現(xiàn) KVO 的。
  • 同時派生類還重寫了 class 方法以“欺騙”外部調用者它就是起初的那個類鱼辙。然后系統(tǒng)將這個對象的 isa 指針指向這個新誕生的派生類廉嚼,因此這個對象就成為該派生類的對象了玫镐,因而在該對象上對 setter 的調用就會調用重寫的 setter倒戏,從而激活鍵值通知機制。此外恐似,派生類還重寫了 dealloc 方法來釋放資源杜跷。

歡迎關注我的個人微信公眾號,免費送計算機各種最新視頻資源!你想象不到的精彩葛闷!


0.jpg
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末憋槐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子淑趾,更是在濱河造成了極大的恐慌阳仔,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扣泊,死亡現(xiàn)場離奇詭異近范,居然都是意外死亡,警方通過查閱死者的電腦和手機延蟹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門评矩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阱飘,你說我怎么就攤上這事斥杜。” “怎么了沥匈?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵蔗喂,是天一觀的道長。 經常有香客問我高帖,道長弱恒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任棋恼,我火速辦了婚禮返弹,結果婚禮上,老公的妹妹穿的比我還像新娘爪飘。我一直安慰自己义起,他們只是感情好,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布师崎。 她就那樣靜靜地躺著默终,像睡著了一般。 火紅的嫁衣襯著肌膚如雪犁罩。 梳的紋絲不亂的頭發(fā)上齐蔽,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音床估,去河邊找鬼含滴。 笑死,一個胖子當著我的面吹牛丐巫,可吹牛的內容都是我干的谈况。 我是一名探鬼主播勺美,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碑韵!你這毒婦竟也來了赡茸?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤祝闻,失蹤者是張志新(化名)和其女友劉穎占卧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體联喘,經...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡屉栓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了耸袜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片友多。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖堤框,靈堂內的尸體忽然破棺而出域滥,到底是詐尸還是另有隱情,我是刑警寧澤蜈抓,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布启绰,位于F島的核電站,受9級特大地震影響沟使,放射性物質發(fā)生泄漏委可。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一腊嗡、第九天 我趴在偏房一處隱蔽的房頂上張望着倾。 院中可真熱鬧,春花似錦燕少、人聲如沸卡者。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崇决。三九已至,卻和暖如春底挫,著一層夾襖步出監(jiān)牢的瞬間恒傻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工建邓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盈厘,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓涝缝,卻偏偏與公主長得像扑庞,于是被迫代替她去往敵國和親譬重。 傳聞我的和親對象是個殘疾皇子拒逮,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容