KVO

一.原理
KVO是系統(tǒng)用運(yùn)行時(shí)機(jī)制給需要觀察的對(duì)象增加一個(gè)子類的方法實(shí)現(xiàn)的锋华,如果一個(gè)對(duì)象被觀察氛驮,系統(tǒng)會(huì)給他增加以各子類葛作,重寫它的set方法寿羞,從而實(shí)現(xiàn)觀察對(duì)象屬性變化的功能,為了使外部看不出來赂蠢,系統(tǒng)還重寫了被觀察對(duì)象的-class绪穆,-isEqual:等方法。
二.自定義KVO(僅實(shí)現(xiàn)key,未實(shí)現(xiàn)keyPath)
1.這個(gè)方式是給要觀察的類添加一個(gè)子類

- (Class)achiveNewSubClass:(NSString *)className
          withCurrentClass:(Class)currentClass
{
  Class newClass = objc_allocateClassPair([self class],
                                          className.UTF8String,
                                          0);
  
  // 可以在這里給類添加成員變量等
  objc_registerClassPair(newClass);
  return newClass;
}

2.這個(gè)是重寫被觀察對(duì)象的set方法

void kvo_setter(id self, SEL selecter, id newValue) {
  
  KHHandle handle = objc_getAssociatedObject(self,
                                             @"123".UTF8String);
  NSString * key = achiveKeyPath(selecter);
  
  
  struct objc_super superclazz = {
    .receiver = self,
    .super_class = class_getSuperclass(object_getClass(self))
  };
  
    id oldValue = [self valueForKey:key];

  void (* objc_msgSendToSuper)(struct objc_super * ,SEL , id) = (void *)objc_msgSendSuper;
  // 在這里調(diào)取運(yùn)行時(shí)創(chuàng)建的子類的父類的set方法賦值
  objc_msgSendToSuper(&superclazz, selecter, newValue);
    
  NSDictionary * dict = @{KHKeyValueNew : newValue ?:  @"",
                          KHKeyValueOld : oldValue ?: @"",
                          };
  handle(dict);
}

3.這個(gè)是提供給外部調(diào)用的方法

- (void)KH_addObserverWithKeyPath:(NSString *)keyPath
                        withBlock:(KHHandle)handle
{
  Class currentClass = [self class];
  NSString * className = NSStringFromClass(currentClass);
  if ([className hasPrefix:CLASS_PREFIX]) return;
  className = [CLASS_PREFIX stringByAppendingString:className];
  Class subClass =NSClassFromString(className);
  if (subClass) return;
  objc_setAssociatedObject(self,
                           @"123".UTF8String,
                           handle,
                           OBJC_ASSOCIATION_COPY_NONATOMIC);
  subClass = [self achiveNewSubClass:className
                    withCurrentClass:currentClass];
  
  object_setClass(self, subClass);
  
  SEL selecter = NSSelectorFromString(achiveMethodName(keyPath));
  
  Method me = class_getInstanceMethod(currentClass, selecter);
  
  const char * types =  method_getTypeEncoding(me);
  
 BOOL isSuccess = class_addMethod(subClass, selecter, (IMP)kvo_setter, types);
  
  
  NSLog(@"%d",isSuccess);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市霞幅,隨后出現(xiàn)的幾起案子漠吻,更是在濱河造成了極大的恐慌量瓜,老刑警劉巖司恳,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異绍傲,居然都是意外死亡扔傅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門烫饼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猎塞,“玉大人,你說我怎么就攤上這事杠纵≤ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵比藻,是天一觀的道長(zhǎng)铝量。 經(jīng)常有香客問我,道長(zhǎng)银亲,這世上最難降的妖魔是什么慢叨? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮务蝠,結(jié)果婚禮上拍谐,老公的妹妹穿的比我還像新娘。我一直安慰自己馏段,他們只是感情好轩拨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著院喜,像睡著了一般亡蓉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上够坐,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天寸宵,我揣著相機(jī)與錄音,去河邊找鬼元咙。 笑死梯影,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的庶香。 我是一名探鬼主播甲棍,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼赶掖!你這毒婦竟也來了感猛?” 一聲冷哼從身側(cè)響起七扰,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陪白,沒想到半個(gè)月后颈走,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咱士,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年立由,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片序厉。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锐膜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弛房,到底是詐尸還是另有隱情道盏,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布文捶,位于F島的核電站荷逞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拄轻。R本人自食惡果不足惜颅围,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恨搓。 院中可真熱鬧院促,春花似錦、人聲如沸斧抱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辉浦。三九已至弄抬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宪郊,已是汗流浹背掂恕。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弛槐,地道東北人懊亡。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像乎串,于是被迫代替她去往敵國(guó)和親店枣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • 本篇會(huì)對(duì)KVO的實(shí)現(xiàn)進(jìn)行探究,不涉及太多KVO的使用方法鸯两,但是會(huì)有一些使用時(shí)的思考闷旧。 一、使用上的疑問 1.key...
    奮拓達(dá)閱讀 507評(píng)論 0 2
  • 上半年有段時(shí)間做了一個(gè)項(xiàng)目钧唐,項(xiàng)目中聊天界面用到了音頻播放忙灼,涉及到進(jìn)度條,當(dāng)時(shí)做android時(shí)候處理的不太好逾柿,由于...
    DaZenD閱讀 3,017評(píng)論 0 26
  • FBKVOController是一個(gè)簡(jiǎn)單易用的鍵值觀察框架缀棍,KVOController 對(duì)于 Cocoa 中 KV...
    我有小尾巴快看閱讀 1,387評(píng)論 0 0
  • 本篇會(huì)對(duì)KVO的實(shí)現(xiàn)進(jìn)行探究宅此,不涉及太多KVO的使用方法机错,但是會(huì)有一些使用時(shí)的思考。 一父腕、使用上的疑問 1.key...
    孢子菌閱讀 2,184評(píng)論 7 13
  • KVO屬性依賴 看一個(gè)例子:我們的模型類 LabColor 代表一種 lab色彩空間里的顏色璧亮。和 RGB 不同萧诫,這...
    毅個(gè)天亮閱讀 755評(píng)論 0 1