kvc 與 kvo

1.KVO KVC 沒聯系

2.KVO 是監聽屬性值的改變

3.KVO 底層實現原理是系統給當前類創建子類 , 在子類 setter 方法調用父類的 setter 方法

1.kvc ? 原理, 運行時------>遍歷----找到屬性(key)賦值

.可以訪問私有成員變量的值

2.可以間接修改私有成員變量的值(替換系統自帶的導航欄、tabbar)

舉個例子:我現在要替換系統自帶的tabbar,但是,系統的是“ readonly”的。解決方法是:KVC。

賦值原理:

(1)去模型中查找有沒有setIcon方法,就直接調用這個set方法,給模型這個屬性賦值[self setIcon:dict[@"icon"]];

(2)如果找不到set方法,接著就會去尋找有沒有icon屬性,如果有,就直接訪問模型中icon = dict[@"icon"];

(3)如果找不到icon屬性,接著又會去尋找_icon屬性,如果有,直接_icon = dict[@"icon"];

(4)如果都找不到就會報錯

[ 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 雖然都是通過鍵去找值但 KeyPath 會自動尋址

//比如說我 height 屬性里還有一個"躺下的高度"或"站著的高度"(哈哈還 ?太污了)

//通過 KeyPath 就會層層深入找到 ?Key 就只能找 height 這一層

//NSKeyValueObservingOptionOld 屬性的舊值

//NSKeyValueObservingOptionNew 屬性的新值

//context 攜帶的參數

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

//我要改值了

person.height = 181;

}

//keyPath

//object 被修改屬性的類的對象

//change 返回改變前后的屬性與屬性值(字典)

//context 攜帶的參數

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

NSLog(@"%@",change);

}

kvo觸發

自動觸發的場景:在注冊KVO之前設置一個初始值,注冊之后,設置一個不一樣的值,就可以觸發了

手動觸發演示

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容