天天看點

Object-C學習筆錄(三)NSKeyValueCoding(KVC)協定與NSKeyValueObserving(KVO)協定

繼續上一篇文章。提綱:

1.NSKeyValueCoding(KVC)協定

2.NSKeyValueObserving(KVO)協定

1.NSKeyValueCoding(KVC)協定

KVC主要是提供一種更為靈活的對象屬性的操作方式。要使用KVC需要遵循NSKeyValueCoding協定,不過由于NSObject已經支援了該協定,而所有的類都繼承NSObject;注意:這種對屬性對操作方式可能使得對象的封裝特性失去作用;

1.1KVC的使用

比如說有一個對象man,man對象裡有identifier屬性;那麼可以通過 [man setValue:@"450923199933000" forKey:@"identifier"];為identifier設定屬性值,然後如果要取identifier的值可以通過 [man valueForKey:@"identifier"];

如果man對象裡面有個Address類的對象屬性address(住址);address對象裡屬性有個NSString *home屬性;屬性中的屬性,也可以稱作複合屬性;則可以這麼使用操作home屬性 [man setValue: @“北京”forKey:@"address.home"];擷取home的值:[man valueForKey:@"address.home"];

1.2 KVC運作的機制:

1)對于setValue: ForKey:方法的原理如下:

首先程式會搜尋“setIdentifer”方法,如果有則執行setter,整個操作完成;如果沒有setIdentifier方法,則會搜尋名為“_ identifier”成員變量(無論該變量事在類的接口部分聲明的還是在類的實作部分聲明的),無論是什麼修飾符(@private/@protected等),如果有則執行指派操作;整個操作完成;如果沒有“_identifier”屬性;則會繼續搜尋名為“identifier”的成員變量,也無論是什麼修飾符(@private/@protected等);如果有,則執行指派操作,整個操作完成;如果都沒有,則會執行對象的“setValue:ForUndefineKey:”方法。而預設的“setValue:ForUndefinedKey:”實作隻是抛出一個NSUnknownKeyException異常。覆寫該方法即可。

2)對于valueForKey方法的執行原理:

首先程式會搜尋“identifer”方法,如果有則執行identifier方法傳回其值,整個操作完成;如果沒有identifier方法,則會搜尋名為“_ identifier”成員變量(無論該變量事在類的接口部分聲明的還是在類的實作部分聲明的),無論是什麼修飾符(@private/@protected等),如果有則傳回其值;整個操作完成;如果沒有“_identifier”屬性;則會繼續搜尋名為“identifier”的成員變量,也無論是什麼修飾符(@private/@protected等);如果有,則執行傳回其值,整個操作完成;如果都沒有,則會執行對象的“valueForUndefinedKey:”方法。而預設的“setValue:ForUndefineKey:”實作隻是抛出一個NSUnknownKeyException異常。覆寫該方法即可。

2.NSKeyValueObserving(KVO)協定

要使用KVO需要遵循NSKeyValueObserving協定,不過由于NSObject已經支援了該協定,而所有的類都繼承NSObject;

使用很簡單,首先通過addObserver:forKeyPath option:context: 方法注冊一個監聽器;然後覆寫observeValueForKeyPath:ofObject:change:context:方法;最後當程式退出時别忘了調用removeObserver:forKeyPath:context:方法或者removeObserver:forKeyPath:方法删除監聽;一般這兩個删除監聽的方法是在dealloc方法中調用。