一、KVC
????1糙捺、KVC定義
? ? ? ? kvc鍵值編碼诫咱,在iOS的開發(fā)中,開發(fā)者通過Key名直接訪問對(duì)象的屬性洪灯,或者給對(duì)象的屬性賦值(主要可以給對(duì)象的私有屬性賦值)坎缭。而不需要調(diào)用明確的存取方法。這樣就可以在運(yùn)行時(shí)動(dòng)態(tài)地訪問和修改對(duì)象的屬性签钩。
????2掏呼、底層實(shí)現(xiàn)
? ? ? ? 當(dāng)對(duì)象調(diào)用setValue方法時(shí),方法內(nèi)部會(huì)做一下操作:
? ? ? ? (1)檢查是否存在相應(yīng)key的set方法铅檩,如果存在就調(diào)用set方法憎夷;
? ? ? ? (2)如果set方法不存在,就查找與key相同的名稱并且?guī)聞澗€的成員屬性柠并,如果有則直接給成員屬性賦值岭接;
? ? ? ? (3)如果沒有找到_key,就查找相同名稱的屬性key臼予,如果有直接賦值鸣戴;
? ? ? ? (4)如果還沒找到,則調(diào)用valueForUndefinedKey: 和 setValue: forUndefinedKey:方法粘拾;
? ? ? ? 這些方法的默認(rèn)實(shí)現(xiàn)都是拋出異常窄锅,我們可以根據(jù)需要重寫它們。
? ? ?3缰雇、方法
-(nullable id)valueForKey:(NSString*)key;//直接通過Key來取值
-(void)setValue:(nullable id)value forKey:(NSString*)key;//通過Key來設(shè)值
-(nullable id)valueForKeyPath:(NSString*)keyPath;//通過KeyPath來取值入偷,A對(duì)象擁有B對(duì)象,為B對(duì)象的屬性賦值
-(void)setValue:(nullable id)value forKeyPath:(NSString*)keyPath;//通過KeyPath來設(shè)值
將字典轉(zhuǎn)型成Model械哟,方法:setValuesForKeysWithDictionary:
? ? 例:// 定義一個(gè)字典NSDictionary *dict = @{
? ? ? ? ? ? ? ? ? ? ? ? ? @"name":@"jack",
? ? ? ? ? ? ? ? ? ? ? ? ? @"money":@"20.7",
? ? ? ? ? ? ? ? ? ? ? ? ? };
? ? // 創(chuàng)建模型Person *p = [[Person alloc] init];
? ? // 字典轉(zhuǎn)模型? ? [p setValuesForKeysWithDictionary:dict];
二:KVO
????1疏之、KVO定義
? ? ? ? 鍵值觀察機(jī)制,提供觀察某一屬性變化的方法
? ? 2暇咆、KVO使用
????(1)給對(duì)象的屬性添加觀察者 ? ? ? ??
[appleVC addObserver:self forKeyPath:@"name"options: NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
? ??(2)若該屬性發(fā)生改變锋爪,系統(tǒng)自動(dòng)調(diào)用下面的方法:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)objectchange:(NSDictionary *)change context:(void*)context{? };
? ??(3)取消監(jiān)聽
-(void)dealloc{? ?[person removeObserver:self forKeyPath:@"test"];}
? ? (4)options所包括的內(nèi)容
NSKeyValueObservingOptionNew:change字典包括改變后的值NSKeyValueObservingOptionOld:change字典包括改變前的值NSKeyValueObservingOptionInitial:注冊(cè)后立刻觸發(fā)KVO通知NSKeyValueObservingOptionPrior:值改變前是否也要通知(這個(gè)key決定了是否在改變前改變后通知兩次)
????3.KVO的使用場(chǎng)景
????KVO用于監(jiān)聽對(duì)象屬性的改變丙曙。
(1)下拉刷新其骄、下拉加載監(jiān)聽UIScrollView的contentoffsize亏镰;
(2)webview混排監(jiān)聽contentsize拯爽;
∷髯ァ(3)監(jiān)聽模型屬性實(shí)時(shí)更新UI;
√号凇(4)監(jiān)聽控制器frame改變逼肯,實(shí)現(xiàn)抽屜效果。
????4否副、KVO優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1.能夠提供一種簡(jiǎn)單的方法實(shí)現(xiàn)兩個(gè)對(duì)象間的同步汉矿;
2.能夠?qū)Ψ俏覀儎?chuàng)建的對(duì)象,即內(nèi)部對(duì)象的狀態(tài)改變作出響應(yīng)备禀,而且不需要改變內(nèi)部對(duì)象的實(shí)現(xiàn);
3.能夠提供觀察的屬性的最新值及先前值奈揍;
4.用keypaths觀察屬性曲尸,也可以觀察嵌套的對(duì)象;
缺點(diǎn):
1.觀察的屬性必須使用string來定義男翰;
2.對(duì)屬性重構(gòu)將導(dǎo)致我們的觀察代碼不可再用另患;
3.當(dāng)釋放觀察者時(shí)需要移除觀察者。