KVO與KVC的區(qū)別:
KVO是指鍵-值-觀察者模式,鍵值監(jiān)聽,監(jiān)聽一個對象屬性值的改變霉晕,KVO是基于KVC的。
KVC是鍵-值編碼捞奕,通過一個字符串的key來找到value牺堰,是value for key方法,直接或通過實例變量訪問的機(jī)制颅围,利用KVC可以隨意修改一個對象的屬性伟葫,或者成員變量,并且私有變量也可以修改院促。
KVO
KVO是觀察者模式筏养,說白了就是你關(guān)新的一個值改變了,你就會得到通知常拓,你就可以在你想要處理的地方處理這個值渐溶,KVO機(jī)制很適合實現(xiàn)model和Controller類之間的通訊。
與NSNotification不同的是弄抬,KVO不需要通知中心對象茎辐,而是在對象屬性變化之后會通知觀察者
KVO的使用
1.注冊需要觀察的對象的屬性addObserver: forKeyPath: options:context:
2.實現(xiàn)observeValueForKeyPath:ofObject:change:context:
方法,這個方法觀察的屬性變化時會自動調(diào)用
3.取消注冊觀察removeObserver:forKeyPath:context:
KVO的底層實現(xiàn)
當(dāng)一個類的屬性被觀察的時候掂恕,系統(tǒng)會通過runtime動態(tài)的創(chuàng)建一個改類的派生類拖陆,并且會再這個類中重寫基類被觀察的屬性的setter方法,而且系統(tǒng)將這個類的isa指針指向了派生類懊亡,從而實現(xiàn)了給監(jiān)聽的屬性賦值時調(diào)用的是派生類的setter方法依啰,重寫的setter方法會再調(diào)用原setter方法前后,通知觀察對象值的改變斋配。
KVC
一個非正式的Protocol孔飒,提供一種機(jī)制來間接訪問對象的屬性,而不是通過調(diào)用setter艰争、getter方法訪問坏瞄。通常是用來給某一個類的屬性進(jìn)行賦值。
KVC最常見的兩種方法就是:
1.對私有變量進(jìn)行賦值
2.字典轉(zhuǎn)模型
需要注意:
1.字典轉(zhuǎn)模型的時候甩卓,字典中的key一定要在模型中有對應(yīng)的屬性
2.如果一個模型中包含了另外模型對象鸠匀,是不能直接轉(zhuǎn)化成功的
3.通過kvc轉(zhuǎn)化模型中的模型,也是不能直接轉(zhuǎn)化成功的