iOS KVC 和 KVO 的學習
KVC (NSKey Value Coding) :鍵值編碼
KVO (Key Value Observing) :鍵值監聽
前言:我曾經用過 監聽 一個音頻何時結束 監聽視頻播放 狀態等 用了這種方法 今天特地總結一下KVC 和 KVO.以方便以后深入學習與運用. 再而有了全新認識,再做更專業的總結.
KVC : 一個非正式的Protocol,提供一種機制來間接訪問對象的屬性。而不是通過調用Setter、Getter方法訪問。
簡單的說,KVC 可以不進行任何操作 就可以進行對象屬性的動態讀寫.
KVC的操作方法由NSKeyValueCoding協議提供,而NSObject就實現了這個協議(KVC),也就是說ObjC中幾乎所有的對象都支持KVC操作,常用的KVC操作方法如下:
· 動態設置: setValue:屬性值 forKey:屬性名(用于簡單路徑)、setValue:屬性值 forKeyPath:屬性路徑(用于復合路徑,例如Person有一個Account類型的屬性,那么person.account就是一個復合屬性)
· 動態讀?。?span style="color: rgba(0, 0, 255, 1)"> valueForKey:屬性名 、valueForKeyPath:屬性名(用于復合路徑)
注意:
(1). key的值必須正確,如果拼寫錯誤,會出現異常
(2). 當key的值是沒有定義的,valueForUndefinedKey:這個方法會被調用,如果你自己寫了這個方法,key的值出錯就會調用到這里來
(3). 因為類key反復嵌套,所以有個keyPath的概念,keyPath就是用.號來把一個一個key鏈接起來,這樣就可以根據這個路徑訪問下去
(4). NSArray/NSSet等都支持KVC
KVO :就是基于 KVC 實現的關鍵技術之一。這是一個典型的觀察者模式,觀察者在鍵值改變時會得到通知.
KVO的使用也很簡單,就是簡單的3步。
1.注冊需要觀察的對象的屬性addObserver:forKeyPath:options:context:
2.實現observeValueForKeyPath:ofObject:change:context:方法,這個方法當觀察的屬性變化時會自動調用
3.取消注冊觀察removeObserver:forKeyPath:context: //在dealloc中移除觀察者
注冊方法的參數:
object : 被觀察對象
observer: 觀察對象
forKeyPath里面帶上property的name,如UIView的frame、center等等
options: 有4個值,分別是:
NSKeyValueObservingOptionNew 把更改之前的值提供給處理方法
NSKeyValueObservingOptionOld 把更改之后的值提供給處理方法
NSKeyValueObservingOptionInitial 把初始化的值提供給處理方法,一旦注冊,立馬就會調用一次。通常它會帶有新值,而不會帶有舊值。
NSKeyValueObservingOptionPrior 分2次調用。在值改變之前和值改變之后。
注:例子里的0就代表不帶任何參數進去
context: 可以帶入一些參數,其實這個挺好用的,任何類型都可以,自己強轉就好了。
實現方法的參數:
keyPath: 對應forKeyPath
object: 被觀察的對象
change: 對應options里的NSKeyValueObservingOptionNew、NSKeyValueObservingOptionOld等
context: 對應context
注意:
(1) 需要強調的是KVO的回調要被調用,屬性必須是通過KVC的方法來修改的,如果是調用類的其他方法來修改屬性,這個觀察者是不會得到通知的。
(2)KVO實現原理:kvo實現通知對象的具體原理是什么呢?其實這是通過Objective-C強大的runtime運行時機制實現的。當你第一次觀察某個對象時,runtime會創建一個新的繼承被監聽類的子類。在這個新的類中,它會重寫所有被觀察的key,然后將對象的isa指針指向新創建的類(oc語言中,每一個類實際上也是一個對象。每一個類也有一個isa指針)。所以對象神奇的變成了新的子類的實例。這些被重寫的方法中添加了調用通知觀察者的方法的代碼。當一個對象的一個屬性改變時,會觸發setKey方法,但這個方法被重寫了,并且在內部添加了發送通知機制
KVO和NSNotification的區別:
和delegate一樣,KVO和NSNotification的作用也是類與類之間的通信,與delegate不同的是
1)這兩個都是負責發出通知,剩下的事情就不管了,所以沒有返回值;
2)delegate只是一對一,而這兩個可以一對多。這兩者也有各自的特點。
3)不同于KVO,NSNotification不依賴于鍵值監聽
參考:
http://www.mamicode.com/info-detail-515516.html
http://www.rzrgm.cn/kenshincui/p/3871178.html
posted on 2016-06-14 14:42 ACM_Someone like you 閱讀(240) 評論(0) 收藏 舉報
浙公網安備 33010602011771號