KVC與KVO詳細介紹

第一、KVO

/**
    KVO-----Key-Value Observing即鍵值監聽當指定對象的某個屬性發生改變時,對象就會接收到通知。
    KVO與通知的區別:前者是被觀察者向觀察者發送通知,後者是一箇中心對象誒所有觀察者提供變更通知
 */

/**
    - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;
 
    observe  觀察者
    keyPath  監聽的屬性
    option   獲得屬性的值
 
 */

/**
    添加觀察者後要實現的方法
    keyPath  監聽的屬性
    change   屬性改變後的值
 */
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
    if ([keyPath isEqualToString:@"text"]) {
         NSLog(@"%@--%@",[change objectForKey:@"old"],[change objectForKey:@"new"]);
    }
}

/**
    移除觀察者,這一步必須要做。(添加觀察者和移除觀察者必須成對存在)
 */
-(void)dealloc{
    [self.KVO_Lable removeObserver:self forKeyPath:@"text"];
}
第二、KVC

#pragma mark --- KVC 
/**
    KVC:Key-Value Coding,即鍵值編碼,我們可以動態設置對象的屬性的值。
    如果動態設置屬性,系統優先調用setter方法,如果沒有實現setter方法則優先搜索成員變量即_屬性,如果仍然找不到的話直接搜索成員變量屬性,最後仍然搜不到的話調用setValue:forUndefineKey方法
    如果是動態讀取屬性,則優先考慮getter方法,如果沒有實現getter方法則優先搜索成員變量_屬性,如果仍然不存在的話直接搜索成員變量屬性,最後仍然搜索不到則會調用valueforUndefinedKey:方法。
    
    注意:搜索過程中不管這些方法、成員變量是私有還是公共的都可以被讀取,不會因爲是私有而導致失敗
 
    value屬性值   keyPath複合路徑
    - (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
    value屬性值   key簡單路徑
    - (void)setValue:(nullable id)value forKey:(NSString *)key;
    複合路徑與簡單路徑的區別:簡單路徑只有一層(這個人的名字屬性),而複合路徑多層(這個人的狗屬性,狗仍然有名字屬性)。
 */

代碼傳送門:https://github.com/fuzongjian/KVOKVC.git

發佈了64 篇原創文章 · 獲贊 10 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章