iOS----KVC和KVO 詳解


一. 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改變,實現抽屜效果。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM