什麼是KVC

在iOS開發過程當中,咱們常常會聽到或者用到KVO/KVC,可是對於什麼是KVO和KVC,咱們可能沒有那麼瞭解。下面先讓咱們來了解一下什麼是KVC.數組

什麼是KVC測試

在蘋果的官方文檔中是這樣描述KVC的:它是一種經過字符串描述符而不是經過調用訪問方法或者直接使用實例變量的非直接的訪問對象屬性的機制,說白了就是KVO是一種經過很是規方法訪問成員變量或者屬性的機制,這種很是規方式就是經過一個字符串標示符也就是所謂的key來訪問屬性或者成員變量。而這個key通常就是屬性名或者實例變量名。編碼

對於KVC的基本的方法都定義在NSKeyValueCoding的非正式協議中,而且NSObject默認實現了該協議。spa

KVC不只支持對象類型,也支持數值類型和結構體。非對象類型的參數和返回類型會自動封裝成NSValue或NSNumber類型。對象

  • KVO能夠用來訪問三種不一樣的對象值類型:屬性、一對一關係、一對多關係開發

  • 屬性能夠是諸如數值、字符串、bool類型等簡單的值。也能夠NSNumber或者NSColor這樣的對象值。文檔

  • 在一對一關係裏的對象能夠擁有它本身的屬性,這些屬性能夠在不改變對象的狀況下被改變。像UIView的superView的屬性,咱們能夠更改superView的屬性,而不須要更改UIView。字符串

  • 一對多屬性是一些相關對象的集合。一般用NSArray或者NSSet來存儲這些集合。KVO也容許用戶自定義集合類,但依然是像訪問NSArray或者NSSet同樣訪問它們。it

鍵和鍵路徑io

鍵是用來標識一個對象屬性的字符串。通常狀況下,鍵就是訪問方法或者是對象的實例變量的名字。鍵必須是ASCII編碼,以小寫字母開頭,而且不能包含空格。舉幾個鍵的例子:age、firstName、lastNmame等。

鍵路徑是一串由點分隔的鍵組成的字符串,它是用來遍歷一系列的對象屬性的。第一個鍵的屬性是跟接收者相關的,而每個子系列是跟前一個屬性相關的。好比鍵路徑address.street,這個鍵路徑會首先從接收者得到address屬性,而後從address屬性中得到street屬性。

用KVC得到屬性的值

方法valueForKey:會返回跟接收者相關的key的值。若是對於指定的key沒有訪問器或者實例變量,則給本身發送一個valueForUndefinedKey:消息,這個方法的默認實現是拋出一個NSUndefinedKeyException。子類能夠重寫這個方法。

一樣的,valueForKeyPath:返回跟接收者相關的鍵路徑的值。對於子系列中任何不遵循KVC的對象,都會收到一個valueForUndefineKey:消息。

dictionaryWithValuesForKeys:會檢索數組中全部跟接收者相關的key的值。返回的NSDictionary中包含了數組中全部key的值。

注意:集合對象,好比NSArray、NSSet和NSDictionary中不能將nil做爲一個值。相反的,應該用NSNull對象代替nil。NSNull是一個表明nil的對象屬性。dictionaryWithValuesForKeys:和setValuesForKeysWithDictionary:方法的實現中,默認會在nil和NSNull之間進行轉換。在你的對象中,不須要對nil作顯示的測試。

用KVC設置屬性的值

方法setValue:forKey:是將接收者中相關key的值設置成指定的值。在這個方法的實現中,會將NSValue的值轉換成普通的數值而後賦給屬性。

若是指定的key不存在,會給接收者發送一個setValue:forUndefinedKey:消息。這個方法的默認實現是拋出一個NSUndefinedKeyException異常,子類能夠重寫這個方法來自定義默認行爲。

方法setValue:forKeyPath:的實現跟前面的同樣,只不過它是用來處理鍵路徑的。

setValuesForKeysWithDictionary:方法是用指定字典裏的值來賦給接收者相關的屬性。這個方法的默認實現是對每一對鍵-值都調用一次setValue:forKey:方法,而且自動將nil轉成NSNull。

最後,你要關心的當嘗試將一個nil值賦給一個非對象類型的時候該怎麼辦。這種狀況下,接收者會發出一個setNilValueForKey:消息,這個方法的默認實現是拋出一個NSInvalidArgumentException。在你的應用中能夠重寫這個方法來定義一個默認值,而後用新的值觸發setValue:forKey:。

相關文章
相關標籤/搜索