一. KVC
1.KVC介紹
KVC 就是鍵值編碼(key-value-coding)。
2.KVC 的主要作用:
(1)通過鍵值路徑為對象的屬性賦值。主要是可以為私有的屬性賦值。
AppleViewController *appleVC = [[AppleViewController alloc]init]; [appleVC setValue:@"橘子" forKey:@"name"];
如果對象A的屬性是一個對象B,要設置對象B的屬性
[person setValue:@"旺財" forKeyPath:@"dog.name"];
(2)通過鍵值路徑獲取屬性的值。主要是可以通過key獲得私有屬性的值。
NSString *nameStr = [appleVC valueForKey:@"name"];
也可以通過keypath獲得值
NSString *dName = [person valueForKeyPath:@"dog.name"];
(3)將字典轉型成Model,方法:setValuesForKeysWithDictionary:
// 定義一個字典 NSDictionary *dict = @{ @"name" : @"jack", @"money" : @"20.7", }; // 創建模型 Person *p = [[Person alloc] init]; // 字典轉模型 [p setValuesForKeysWithDictionary:dict]; NSLog(@"person's name is the %@",p.name);
注意:字典的key和Model的屬性一定要一一對應。否則會出現錯誤。比如person里沒有name的屬性,系統報錯如下:
'[<Person 0x60000001d0b0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key name.'
二. KVO
1.KVO介紹:
KVO 是鍵值觀察者(key-value-observing)。KVO提供了一種觀察者的機制,通過對某個對象的某個屬性添加觀察者,當該屬性改變,就會調用"observeValueForKeyPath:"方法,為我們提供一個“對象值改變了!”的時機進行一些操作。
2.KVO原理
當某個類的對象第一次被觀察時,系統在運行時會創建該類的派生類,改派生類中重寫了該對象的setter方法,並且在setter方法中實現了通知的機制。派生類重寫了class方法,以“欺騙”外部調用者他就是原先那個類。系統將這個類的isa指針指向新的派生類,因此改對象也就是新的派生類的對象了。因而改對象調用setter就會調用重寫的setter,從而激活鍵值通知機制。此外派生類還重寫了delloc方法來釋放資源。
3.KVO的使用
(1)給對象的屬性添加觀察者
[appleVC addObserver:self forKeyPath:@"name" options: NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
注: options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld 返回未改變之前的值和改變之后的值 context可以為空
(2)若該屬性發生改變,系統自動調用下面的方法:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context { //拿到新值/舊值,進行操作 NSLog(@"newValue----%@",change[@"new"]); NSLog(@"oldValue----%@",change[@"old"]); }
(3)取消監聽
-(void)dealloc { [person removeObserver:self forKeyPath:@"test"]; }
4.KVO的使用場景
KVO用於監聽對象屬性的改變。
(1)下拉刷新、下拉加載監聽UIScrollView的contentoffsize;
(2)webview混排監聽contentsize;
(3)監聽模型屬性實時更新UI;
(4)監聽控制器frame改變,實現抽屜效果。
