iOS KVO實現(xiàn)細節(jié)驗證

<strong>驗證<code>KVO</code></strong>

<code>objective-c</code>中的<code>kvo</code>是觀察者模式的一種oc實現(xiàn)。

不管使用方式了亭病,直接看看kvo是如何實現(xiàn)的。
蘋果官方文檔解釋

簡單粗暴的解釋就是,在對一個class 進行kvo監(jiān)聽的時候幔戏,系統(tǒng)內(nèi)部實現(xiàn)了一個子類,繼承自 原先的類税课,然后 替換原先類的 isa指針闲延,重寫set方法,class 方法韩玩。

下面我們驗證一下:

@import ObjectiveC.message;
@import ObjectiveC.runtime;

@interface XXObc : NSObject

@property (nonatomic, copy) NSString *ccc;

@end

@implementation XXObc

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"%@",keyPath);
    
}

@end

在 main 方法中實現(xiàn)

XXObc *xx = [XXObc new];
    
    
    [xx addObserver:xx
         forKeyPath:@"ccc"
            options:NSKeyValueObservingOptionNew
            context:nil];
    
    xx.ccc = @"ccccccc";
    
    IMP imp = class_getMethodImplementation(NSClassFromString(@"NSKVONotifying_XXObc"),
                                            @selector(class));
    
    IMP imp1 = class_getMethodImplementation([xx class], @selector(class));
    
    if (imp != imp1) {
        NSLog(@"11111");
    }

此處 <code> NSKVONotifying_XXObc </code> 就是系統(tǒng)內(nèi)部實現(xiàn)的一個<code>XXObc</code>的子類垒玲。根據(jù)官方文檔的解釋,系統(tǒng)生成<code> NSKVONotifying_XXObc </code>類找颓,然后通過交換原先類的<code>isa</code>指針來實現(xiàn)的KVO,怎么知道<code> NSKVONotifying_XXObc </code>類名的:通過調(diào)用下面方法

po object_getClassName([xx class])

控制臺簡單粗暴的打印合愈。

此處為什么要比較,<code>class</code> 方法的<code>IMP</code>,上面apple的文檔不是說了击狮,不能依賴<code>isa</code> 指針來判斷一個類佛析,要通過<code>class</code> 所以,子類必然是重寫過<code>class</code>方法的彪蓬。

調(diào)試過程

我們自己再創(chuàng)建一個子類寸莫,在<code>addObserver</code>之后修改一下xx的<code>isa</code>指針,看看kvo有沒有效果档冬。

添加如下子類膘茎。

@interface XXXChildObj : XXObc

@end

@implementation XXXChildObj

- (void)setCcc:(NSString *)ccc {
    [super setCcc:ccc];
}

@end

調(diào)試代碼稍微修改

XXObc *xx = [XXObc new];
    
    
    [xx addObserver:xx
         forKeyPath:@"ccc"
            options:NSKeyValueObservingOptionNew
            context:nil];
    
    object_setClass(xx,
                    [XXXChildObj class]);
    
    xx.ccc = @"ccccccc";
    
    IMP imp = class_getMethodImplementation(NSClassFromString(@"NSKVONotifying_XXObc"),
                                            @selector(class));
    
    IMP imp1 = class_getMethodImplementation([XXXChildObj class], @selector(class));
    
    if (imp != imp1) {
        NSLog(@"11111");
    }
    

<code>object_setClass</code>通過這個方法來改變isa指針

這下看到,<code>XXObc</code> 的 <code>observeValueForKeyPath</code> 方法不會再被調(diào)用了酷誓。

系統(tǒng)內(nèi)部實現(xiàn)的子類披坏,比如這里的<code>NSKVONotifying_XXObc</code>。 重寫 class 方法盐数,只是為了麻痹一下開發(fā)者刮萌,隱藏一下實現(xiàn)細節(jié)。也不影響通過 class 方法判斷一下類娘扩,一舉兩得着茸。

以上就是驗證KVO的實現(xiàn)過程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末琐旁,一起剝皮案震驚了整個濱河市涮阔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌灰殴,老刑警劉巖敬特,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掰邢,死亡現(xiàn)場離奇詭異,居然都是意外死亡伟阔,警方通過查閱死者的電腦和手機辣之,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來皱炉,“玉大人怀估,你說我怎么就攤上這事『辖粒” “怎么了多搀?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長灾部。 經(jīng)常有香客問我康铭,道長,這世上最難降的妖魔是什么赌髓? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任从藤,我火速辦了婚禮,結(jié)果婚禮上锁蠕,老公的妹妹穿的比我還像新娘呛哟。我一直安慰自己,他們只是感情好匿沛,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布扫责。 她就那樣靜靜地躺著,像睡著了一般逃呼。 火紅的嫁衣襯著肌膚如雪鳖孤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天抡笼,我揣著相機與錄音苏揣,去河邊找鬼。 笑死推姻,一個胖子當著我的面吹牛平匈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播藏古,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼增炭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拧晕?” 一聲冷哼從身側(cè)響起隙姿,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厂捞,沒想到半個月后输玷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體队丝,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年欲鹏,在試婚紗的時候發(fā)現(xiàn)自己被綠了机久。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡赔嚎,死狀恐怖膘盖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尽狠,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布叶圃,位于F島的核電站袄膏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏掺冠。R本人自食惡果不足惜沉馆,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望德崭。 院中可真熱鬧斥黑,春花似錦、人聲如沸眉厨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憾股。三九已至鹿蜀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間服球,已是汗流浹背茴恰。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斩熊,地道東北人往枣。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像粉渠,于是被迫代替她去往敵國和親分冈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉霸株,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,690評論 0 9
  • 一丈秩、概述 KVO,即:Key-Value Observing淳衙,它提供一種機制蘑秽,當指定的對象的屬性被修改后饺著,則其觀察...
    DeerRun閱讀 10,049評論 11 33
  • 上半年有段時間做了一個項目,項目中聊天界面用到了音頻播放肠牲,涉及到進度條幼衰,當時做android時候處理的不太好,由于...
    DaZenD閱讀 3,015評論 0 26
  • 本文分為2個部分:概念與應(yīng)用缀雳。概念部分旨在剖析 KVO 這一設(shè)計模式的實現(xiàn)原理渡嚣;應(yīng)用部分通過創(chuàng)建的項目,以說明 K...
    啊左閱讀 57,649評論 107 438
  • iOS--KVO的實現(xiàn)原理與具體應(yīng)用 長時間不用容易忘,這篇文章挺好的.轉(zhuǎn)載自看本文分為2個部分:概念與應(yīng)用肥印。概念...
    超_iOS閱讀 1,436評論 0 17