Objective-C 鍵值編碼(Key-Value Coding)鍵-值編碼( Key-Value Coding ),簡稱 KVC 。提供了一種間接訪問對象的方式。 在KVC中最常用的方法是: -valueForKey: 和 -setValue:forKey: 。
Objective-C
valueForKey:首先查找以name命名的getter方法:-name。如果找不到,就會尋找名為_name或name的實例變量。所以通過使用KVC,即使沒有g(shù)etter方法,也不通過對象指針,照樣可以訪問屬性。 KVC還有一個特性,比如valueForKey:方法會自動將獲取的標(biāo)量值(int、float、struct)放入NSNumber或NSValue中(稱為“裝箱”)。
Objective-C
獲取的modelYear屬性值,實際上是一個int,但由于被valueForKey:自動“裝箱”,所以NSLog使用了%@格式符。
Objective-C
setValue:forKey:首先查找名為setName的setter方法,如果找不到,就尋找名為name或_name的實例變量,然后賦值。 如果想要設(shè)置一個標(biāo)量值,在調(diào)用setValue:forKey:之前需要先“裝箱”,因為setValue:forKey:方法會自動“拆箱”。
Objective-C
鍵路徑( key path ) KVC支持key path。對應(yīng)的方法是: setValue:forKeyPath: 和 valueForKeyPath: 。
Objective-C
engine.horsepower就稱為key path,engine是car的實例變量,而horsepower是engine的實例變量。key path的深度不限,只取決于對象圖(object graph)。使用key path比使用方法嵌套更容易訪問“深層”的變量。 聚合操作( Aggregated Assault ) 看實例:
Objective-C
tires是car的一個數(shù)組變量(NSMutableArray *tires)。在KVC中,上面這行代碼會訪問數(shù)組中的每一個對象的pressure的值,并將結(jié)果同樣組織成一個數(shù)組返回。 這個特性用起來會非常方便。但不支持?jǐn)?shù)組索引訪問,如:tires[0].pressure。 Smooth Operator 還可以在key path中添加一些有用的運(yùn)算。
Objective-C
cars是garage(車庫)的一個數(shù)組變量(NSMutableArray *cars),在key path中的 @count 用于通知KVC機(jī)制計算對象總數(shù)。
Objective-C
@sum 用于對所有車輛的mileage(里程)求和。
Objective-C
@avg 用于計算平均每輛車的行駛里程。
Objective-C
@min 和 @max 分別是求最小值和最大值的。
Objective-C
@distinctUnionOfObjects 會計算一組對象(這里是make(制造商))的并集,刪除其中的重復(fù)值。 KVC的這些運(yùn)算雖然便捷,但速度較慢。如果key path有誤,編譯器并不能判斷出來,而是會出現(xiàn)運(yùn)行時錯誤。 Batch (批處理、批量操作) 相關(guān)方法: dictionaryWithValuesForKeys: 和 setValuesForKeysWithDictionary: 。
Objective-C
dictionaryWithValuesForKeys:方法為鍵@”make”、@”model”、@”modelYear”分別求值,然后構(gòu)造成一個NSDictionary對象返回。輸出結(jié)果可能為:
Objective-C
使用setValuesForKeysWithDictionary:批量修改。
Objective-C
處理未定義的鍵 可以重寫valueForUnde?nedKey:和setValue:forUnde?nedKey:方法來處理未定義的鍵。(KVC在無法處理某個key時,會退回并詢問類該如何處理,默認(rèn)的實現(xiàn)是取消操作) 這里通過重寫如上兩個方法,使得class Garage可以設(shè)置和讀取任何key。
Objective-C
《Objective-C基礎(chǔ)教程》讀書筆記 |
|