1.KVO KVC 沒(méi)聯(lián)系
2.KVO 是監(jiān)聽(tīng)屬性值的改變
3.KVO 底層實(shí)現(xiàn)原理是系統(tǒng)給當(dāng)前類創(chuàng)建子類 , 在子類 setter 方法調(diào)用父類的 setter 方法
1.kvc ? 原理, 運(yùn)行時(shí)------>遍歷----找到屬性(key)賦值
.可以訪問(wèn)私有成員變量的值
2.可以間接修改私有成員變量的值(替換系統(tǒng)自帶的導(dǎo)航欄寇漫、tabbar)
舉個(gè)例子:我現(xiàn)在要替換系統(tǒng)自帶的tabbar,但是世囊,系統(tǒng)的是“ readonly”的杯拐。解決方法是:KVC。
賦值原理:
(1)去模型中查找有沒(méi)有setIcon方法,就直接調(diào)用這個(gè)set方法,給模型這個(gè)屬性賦值[self setIcon:dict[@"icon"]];
(2)如果找不到set方法锋华,接著就會(huì)去尋找有沒(méi)有icon屬性,如果有,就直接訪問(wèn)模型中icon = dict[@"icon"];
(3)如果找不到icon屬性,接著又會(huì)去尋找_icon屬性,如果有,直接_icon = dict[@"icon"];
(4)如果都找不到就會(huì)報(bào)錯(cuò)
[ setValue:forUndefinedKey:]
用處:修改pageControl圖片
UIPageControl *pageControl = [[UIPageControl alloc] init];
[pageControl setValue:[UIImage imageNamed:@"home_slipt_nor"] forKeyPath:@"_pageImage"];
[pageControl setValue:[UIImage imageNamed:@"home_slipt_pre"] forKeyPath:@"_currentPageImage"];
2.kvo
//注意 KeyPath 與 Key 雖然都是通過(guò)鍵去找值但 KeyPath 會(huì)自動(dòng)尋址
//比如說(shuō)我 height 屬性里還有一個(gè)"躺下的高度"或"站著的高度"(哈哈還 ?太污了)
//通過(guò) KeyPath 就會(huì)層層深入找到 ?Key 就只能找 height 這一層
//NSKeyValueObservingOptionOld 屬性的舊值
//NSKeyValueObservingOptionNew 屬性的新值
//context 攜帶的參數(shù)
[person addObserver:self forKeyPath:@"height" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
//我要改值了
person.height = 181;
}
//keyPath
//object 被修改屬性的類的對(duì)象
//change 返回改變前后的屬性與屬性值(字典)
//context 攜帶的參數(shù)
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context{
NSLog(@"%@",change);
}
kvo觸發(fā)
自動(dòng)觸發(fā)的場(chǎng)景:在注冊(cè)KVO之前設(shè)置一個(gè)初始值,注冊(cè)之后官还,設(shè)置一個(gè)不一樣的值,就可以觸發(fā)了
手動(dòng)觸發(fā)演示