2013-05-04 29 views
1

它似乎是Objective-C上的一個幾乎新的超集,其中點符號與指令混合使用,例如:[email protected](...)和合規性語法,例如:-replaceObjectIn<Key>AtIndex:withObject:。似乎KVC的一大部分類似於簡單的訪問器方法,無論如何都可以進行合成。但是,我會說KVObserving似乎使MVC應用程序更容易。意見?KVC&KVO什麼時候值得麻煩?總是?

回答

4

鍵值編碼允許您查找任意嵌套的屬性,這些屬性的唯一身份只在運行時已知。例如,KVC不是person.name的好替代品 - 對於這樣的特定任務來說,它是不必要的通用名稱。但是讓我們說,我們不知道我們什麼時候編寫我們的程序,我們是否想查找姓名,年齡或最喜歡的鞋品牌。我們經常使用NSTableView數據源來處理這類事情。我們可以寫一個大的,重複的條件送我們想要的消息,但KVC很容易:

return [personController.selectedPerson valueForKeyPath:desiredAttribute]; 

然後,我們可以設置desiredAttribute@"name"@"age"@"favoriteShoeBrand.name",我們將得到正確的值,甚至沒有分支儘管我們只知道我們在運行時需要的屬性。

它也很有用,因爲類可以以特殊方式處理KVC。例如,NSArray做的非常好。 [arrayOfPeople valueForKeyPath:@"name"]不等於arrayOfPeople.name - 相反,它將keypath傳遞給每個對象,並創建一個新數組,並使用這個數組的結果。所以它在許多其他語言中的作用與地圖功能的用途大致相同。還有特殊的KVC操作符,如@distinctUnionOfArrays(它接受數組的集合並將它們合併在一起,忽略重複項),這使得對嵌套集合進行操作的方式比其他方式更加簡潔。

至於KVO,它只是一種在某些事情發生變化時得到通知的方式 - 例如,您可以在用戶的​​生日中更新您的用戶界面並使用新的年齡,而無需UI瞭解生日邏輯。如果這聽起來對你有用,你可能會喜歡它。