KVC
KVC 是 Key-Value Coding 的簡稱,它是一種可以直接通過字元串的名字(key)來通路類屬性的機制。而不是通過調用Setter、Getter方法通路。KVC 機制是由 NSKeyValueCoding 協定定義的。
指派、取值流程
KVC取值

KVC指派
常用API
KVO指派、取值各有兩個方法,一個key,一個keyPath;其中keyPath方法內建了key的所有功能,也就是說對一個對象的一般屬性進行指派、取值,兩個方法是通用的,都可以實作。但是對對象中的對象型屬性進行指派,隻有keyPath能夠實作.
使用場景
- 字典轉模型 ,簡化代碼量
- 修改系統的隻讀變量
- 可以任意修改一個對象的屬性和變量(包括私有變量)
通過KVC改變屬性會觸發KVO,是因為通過KVC指派時内部會觸發setter方法;
在Swift中使用KVC
- 類繼承自NSObject
- 需要KVC的屬性使用@objc進行修飾
KVO
原理
- KVO是關于runtime機制實作的;
- 當某個類的對象屬性第一次被觀察時,系統就會在運作期動态地建立該類的一個派生類,在這個派生類中重寫基類中任何被觀察屬性的setter方法。派生類在被重寫的setter方法内實作真正的通知機制;
- 如果原類為Person,那麼生成的派生類名為NSKVONotifying_Person;
- 每個類對象中都有一個isa指針指向目前類,當一個類對象的第一次被觀察,那麼系統就會偷偷将isa指針指向動态生成的派生類,進而在給被監控屬性指派時執行的是派生類的setter方法;
- 鍵值觀察通知依賴于NSObject的兩個方法:
和willChangeValueForKey:
,在一個被觀察屬性發生改變之前,willChangeValueForKey:一定會被調用,這就會記錄舊的值。而當改變發生後,didChangeValueForKey:會被調用,繼而observeValueForKey:ofObject:change:context:也會被調用didChangeValueForKey:
如果直接給屬性指派,不調用set方法指派是不會觸發KVO的。
我們可以手動調用KVO,也就是在值改變之前手動調用willChangeValueForKey方法,在值改變之後手動調用didChangeValueForKey方法。
使用場景
監聽某個值的變化進而進行相應的操作,如更新UI等。
在Swift中使用KVO
- 類繼承自NSObject
- 需要KVC的屬性使用@objc和dynamic修飾
實際Swift還可以使用
didSet
這種形式來實作屬性值改變觀察