iOS-KVC/KVO

一蔓挖、KVC

通過關鍵字徊都,訪問屬性及成員變量茧痒。
1.kvc當調(diào)用setValue:屬性值 forKey:@”name“的代碼時罕偎,底層的執(zhí)行機制(順序)如下:
①.set方法:set<Key> (注意降淮,通過屬性自動合成的set方法也算)

(BOOL)accessInstanceVariablesDirectly方法有沒有返回YES阶淘,默認該方法會返回YES角溃,繼續(xù)向下尋找是否有滿足的成員變量睬愤。
(如果你重寫了該方法讓其返回NO的話淆九,那么在這一步KVC會直接執(zhí)行⑤setValue:forUNdefinedKey:方法蚂且,不過一般開發(fā)者不會這么做配猫。所以,如果想讓自己的類禁用kvc杏死,可以用此方法返回NO泵肄,不過記得屬性會自動合成set方法)

②.成員變量:
_<key>成員變量佳遣,
_is<Key>成員變量,
<key>成員變量凡伊,
is<Key>成員變量零渐,
③.執(zhí)行該對象的setValue:forUNdefinedKey:方法,默認是拋出異常系忙。

  1. 當調(diào)用valueForKey:@"name"時诵盼,執(zhí)行機制(順序)如下:
    ①.訪問器方法:get<Key>,<key> 银还,is<Key>
    ②.成員變量:
    _<key>成員變量风宁,
    _is<Key>成員變量,
    <key>成員變量蛹疯,
    is<Key>成員變量戒财。

所以KVC支持實例變量。

  1. KVC的keyPath中的集合運算符
    @avg捺弦、@sum饮寞、@max、@min列吼、@count
    必須用在集合對象或集合屬性上幽崩,@"@sum.age"或 @"集合屬性.@max.age"。比如Person類中有個age屬性寞钥,
NSArray *array = [NSArray arrayWithObjects:p1, p2, p3, nil];
NSInteger max = [[array valueForKeyPath:@"@max.age"] integerValue];

二慌申、KVO

1. 基本使用

KVO是一種機制,對象可以指定一個觀察者理郑,來觀察它的某個屬性蹄溉,當該屬性發(fā)生改變時,觀察者會收到通知您炉,來執(zhí)行相應的操作柒爵。

只需兩部即可完成:
步驟一、 添加鍵值觀察

[self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"Person Name"];

參數(shù):

  • 觀察者邻吭,負責處理監(jiān)聽事件的對象
  • 觀察的屬性
  • 觀察的選項
  • 上下文

步驟二餐弱、observer中需要實現(xiàn)一下方法:
// 所有的 kvo 監(jiān)聽到事件宴霸,都會調(diào)用此方法

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;

參數(shù):

  • 觀察的屬性
  • 觀察的對象
  • change 屬性變化字典(新/舊)
  • 上下文囱晴,與監(jiān)聽的時候傳遞的一致

2. 如何手動觸發(fā)KVO

鍵值觀察通知依賴于 NSObject 的兩個方法: willChangeValueForKey:didChangevlueForKey:。所以我們只需要直接調(diào)用這兩個方法瓢谢,即可手動觸發(fā)KVO畸写。

3. 手動實現(xiàn)實例變量支持KVO

如果將一個對象設定成屬性,這個屬性是自動支持KVO的,如果這個對象是一個實例變量,那么氓扛,這個KVO是需要我們自己來實現(xiàn)的枯芬。

需要兩個步驟:
步驟一:實現(xiàn)set方法论笔,在set方法中添加手動觸發(fā)KVO需要的兩個方法。

-(void)setName:(NSString *)name
{
    [self willChangeValueForKey:@"name"];
    _name = name;
    [self didChangeValueForKey:@"name"];
}

步驟二:在該對象中實現(xiàn)automaticallyNotifiesObserversForKey方法千所,指定該key值為非自動監(jiān)聽

+(BOOL)automaticallyNotifiesObserversForKey:(NSString *)key
{
    if ([key isEqualToString:@"name"]) {
        return NO;
    }
    return YES;
}

4. KVO的實現(xiàn)原理

當對象設置了觀察者時狂魔,會生成一個新類,這個類繼承自該對象的原類淫痰,這個新類會重寫set方法最楷,在set方法中增加KVO所依賴的兩個方法willChangeValueForKey:didChangevlueForKey:方法,然后該對象的isa指針指向新生成的類(isa 混寫(isa-swizzling))待错。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末籽孙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子火俄,更是在濱河造成了極大的恐慌犯建,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓜客,死亡現(xiàn)場離奇詭異适瓦,居然都是意外死亡,警方通過查閱死者的電腦和手機谱仪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門犹菇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芽卿,你說我怎么就攤上這事揭芍。” “怎么了卸例?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵称杨,是天一觀的道長。 經(jīng)常有香客問我筷转,道長姑原,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任呜舒,我火速辦了婚禮锭汛,結果婚禮上,老公的妹妹穿的比我還像新娘袭蝗。我一直安慰自己唤殴,他們只是感情好,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布到腥。 她就那樣靜靜地躺著朵逝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乡范。 梳的紋絲不亂的頭發(fā)上配名,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天啤咽,我揣著相機與錄音,去河邊找鬼渠脉。 笑死宇整,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的芋膘。 我是一名探鬼主播没陡,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼索赏!你這毒婦竟也來了盼玄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤潜腻,失蹤者是張志新(化名)和其女友劉穎埃儿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體融涣,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡童番,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了威鹿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剃斧。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖忽你,靈堂內(nèi)的尸體忽然破棺而出幼东,到底是詐尸還是另有隱情,我是刑警寧澤科雳,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布根蟹,位于F島的核電站,受9級特大地震影響糟秘,放射性物質(zhì)發(fā)生泄漏简逮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一尿赚、第九天 我趴在偏房一處隱蔽的房頂上張望散庶。 院中可真熱鬧,春花似錦凌净、人聲如沸悲龟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躲舌。三九已至,卻和暖如春性雄,著一層夾襖步出監(jiān)牢的瞬間没卸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工秒旋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留约计,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓迁筛,卻偏偏與公主長得像煤蚌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子细卧,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

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

  • 前言: 本文基本不講KVC/KVO的用法尉桩,只結合網(wǎng)上的資料說說對這種技術的理解。 由于KVO內(nèi)容較少贪庙,而且是以KV...
    土b蘭博王閱讀 3,063評論 0 33
  • KCV 其實由于ObjC的語言特性蜘犁,你根部不必進行任何操作就可以進行屬性的動態(tài)讀寫,這種方式就是Key Value...
    TYM閱讀 1,059評論 0 4
  • KVC KVC是key Value Coding的縮寫止邮,主要方法有setValue:forKey和valueFor...
    小暖風閱讀 366評論 0 1
  • KVC/KVO 概念 KVC : 即 Key-Value-Coding这橙,用于鍵值編碼。作為 cocoa 的一個標準...
    滿臉胡茬的小碼農(nóng)閱讀 1,960評論 2 8
  • 轉(zhuǎn)至元數(shù)據(jù)結尾創(chuàng)建: 董瀟偉导披,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,720評論 0 9