kvc kvo

原文?kvc kvo

KVC 概論

KVC(全稱 key-value-coding)即鍵值編碼。KVC 的操作方法由NSKeyValueCoding 非正式協(xié)議提供瞪醋,而NSObject(NSKeyValueCoding)就實現(xiàn)了這個協(xié)議,也就是說ObjC中幾乎所有的對象都支持 KVC 操作牍帚,它是一種不通過存取方法(Setter银伟、Getter),而通過屬性名稱字符串(key)間接訪問類屬性(實例變量)的機制并徘。

- (void)setValue:(nullable id)value forKey:(NSString *)key;

- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;

- (id)valueForKey:(NSString *)key;

- (nullable id)valueForKeyPath:(NSString *)keyPath;


KVC 實現(xiàn)原理

1遣钳、[item setValue:@"白開水ln簡書" forKey:@"name"];

1.首先去模型中查找有沒有 setName,若有麦乞,直接調(diào)用賦值 [self setName:@"白開水ln簡書"]耍贾。

2.若無,去模型中查找有沒有 name 屬性路幸,若有荐开,直接訪問屬性賦值 name = value。

3.若無简肴,再去模型中查找有沒有 _name 成員變量晃听,若有,直接訪問屬性賦值 _name = value砰识。

4.找不到能扒,就會直接報找不到的錯誤(valueForUndefinedKey:)。


2辫狼、[item setValuesForKeysWithDictionary:dict];

1.遍歷字典中所有 key初斑。

2.去模型中查找有沒有對應(yīng)的屬性。



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

person.dog = [[LNDog alloc] init];

[person.dog setValue:@"阿黃" forKey:@"name"];

[person setValue:@"旺財" forKeyPath:@"dog.name"];

NSLog(@"%@", person.dog.name);

區(qū)別:forKey: 和 forKeyPath:

1膨处、forKeyPath 包含了所有 forKey 的功能

2见秤、forKeyPath 進行內(nèi)部的點語法,層層訪問內(nèi)部的屬性

3、注意:key 值一定要在屬性中找到真椿,開發(fā)中最好使用forKeyPath鹃答。




KVO(Key-Value-Obersver)即鍵值監(jiān)聽,利用一個key來找到某個屬性并監(jiān)聽其屬性值得改變突硝,當(dāng)該屬性發(fā)生變化時测摔,會自動的通知觀察者,這比通知中心需要post通知來說,簡單了許多锋八。其實這也是一種典型的觀察者模式浙于。

KVO 使用步驟

給目標(biāo)對象的屬性添加觀察者

在回調(diào)方法中監(jiān)聽屬性的變化

移除觀察者

// 1.添加觀察者

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

- (void)dealloc{

// 2.移除觀察者

[self.person removeObserver:self forKeyPath:@"name"];

}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(LNPerson *)person change:(NSDictionary *)change context:(void *)context{

NSLog(@"%@------%@------%@", keyPath, change);

}

KVO 實現(xiàn)原理

當(dāng)一個類的屬性被觀察的時候,系統(tǒng)會通過runtime動態(tài)的創(chuàng)建一個該類的派生類挟纱,而且系統(tǒng)將這個類的isa指針指向了派生類路媚,從而實現(xiàn)了給監(jiān)聽的屬性賦值時調(diào)用的是派生類的setter方法。

還會在這個類的基類中重寫被觀察的屬性的setter方法樊销,重寫的setter方法會在調(diào)用原setter方法前后整慎,通知觀察對象值得改變

同時派生類還重寫了 class 方法以“欺騙”外部調(diào)用者它就是起初的那個類。

此外围苫,派生類還重寫了 dealloc 方法來釋放資源裤园。

KVO 實現(xiàn)原理

可以看到重寫的 setter 方法,給屬性賦值的前后分別調(diào)用了兩個方法剂府。

- (void)willChangeValueForKey:(NSString *)key;

- (void)didChangeValueForKey:(NSString *)key;

而- (void)didChangeValueForKey:(NSString *)key;會調(diào)用

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拧揽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子腺占,更是在濱河造成了極大的恐慌淤袜,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衰伯,死亡現(xiàn)場離奇詭異铡羡,居然都是意外死亡,警方通過查閱死者的電腦和手機意鲸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門烦周,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怎顾,你說我怎么就攤上這事读慎。” “怎么了槐雾?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵夭委,是天一觀的道長。 經(jīng)常有香客問我募强,道長株灸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任钻注,我火速辦了婚禮蚂且,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘幅恋。我一直安慰自己,他們只是感情好泵肄,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布捆交。 她就那樣靜靜地躺著淑翼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪品追。 梳的紋絲不亂的頭發(fā)上玄括,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音肉瓦,去河邊找鬼遭京。 笑死,一個胖子當(dāng)著我的面吹牛泞莉,可吹牛的內(nèi)容都是我干的哪雕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鲫趁,長吁一口氣:“原來是場噩夢啊……” “哼斯嚎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起挨厚,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤堡僻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后疫剃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钉疫,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年巢价,在試婚紗的時候發(fā)現(xiàn)自己被綠了陌选。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹄溉,死狀恐怖咨油,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柒爵,我是刑警寧澤役电,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站棉胀,受9級特大地震影響法瑟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唁奢,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一霎挟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧麻掸,春花似錦酥夭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疙描。三九已至,卻和暖如春讶隐,著一層夾襖步出監(jiān)牢的瞬間起胰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工巫延, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留效五,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓炉峰,卻偏偏與公主長得像畏妖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子讲冠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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

  • KCV 其實由于ObjC的語言特性瓜客,你根部不必進行任何操作就可以進行屬性的動態(tài)讀寫,這種方式就是Key Value...
    TYM閱讀 1,059評論 0 4
  • KVC KVC定義 KVC(Key-value coding)鍵值編碼竿开,就是指iOS的開發(fā)中谱仪,可以允許開發(fā)者通過K...
    暮年古稀ZC閱讀 2,141評論 2 9
  • 作者:wangzz原文地址:http://blog.csdn.net/wzzvictory/article/det...
    反調(diào)唱唱閱讀 1,117評論 0 5
  • 由于Objective-C是基于Smalltalk進行設(shè)計的疯攒,所以它具有動態(tài)加載、動態(tài)綁定等特性列荔。Key-valu...
    趙亦晨閱讀 1,077評論 0 0
  • KVC , KVO KVC和KVO的區(qū)別及應(yīng)用 KVC/KVO原理 1. KVC鍵值編碼 KVC贴浙,即是指NSKey...
    旋葉閱讀 308評論 0 1