當前位置:成語大全網 - 新華字典 - 什麽是KVC

什麽是KVC

在iOS開發過程中,我們經常會聽到或者用到KVO/KVC,但是對於什麽是KVO和KVC,我們可能沒有那麽了解。下面先讓我們來了解壹下什麽是KVC.

什麽是KVC

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

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

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

KVO可以用來訪問三種不同的對象值類型:屬性、壹對壹關系、壹對多關系

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

在壹對壹關系裏的對象可以擁有它自己的屬性,這些屬性可以在不改變對象的情況下被改變。像UIView的superView的屬性,我們可以更改superView的屬性,而不需要更改UIView。

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

鍵和鍵路徑

鍵是用來標識壹個對象屬性的字符串。壹般情況下,鍵就是訪問方法或者是對象的實例變量的名字。鍵必須是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