一直在使用一些方法好比在給模型賦值時使用的setValuesForKeysWithDictionary:jsonObject、改變一些屬性時valueForKeyPath等。但面試的時候,面試官一句給我說一個應用場景。我靠,當時我想吃土。結果是固然回答的很差,固然我會使用KVC,我也知道它,但我不能駕馭KVC。前端
有個觀點我很認同,咱們作前端的只要會用知道怎麼用怎麼搭建出界面就行,這樣咱們的任務就完成。可是若是知道運行原理,咱們能做出更好的App。就好比組裝車的若是知道發動機和剎車運行機制,那麼他就能組出性能更棒的車,也能避免好多問題。面試
a、介紹json
咱們能夠用KVC直接使用字符串訪問成員變量,而不使用setter或者getter方法。緣由是KVC提供了一種在編譯時動態訪問對象屬性和成員變量的方法。它很靈活但同時也失去了在編譯期間的檢查,若是有錯咱們也只能在運行時發現,好比經過使用valueForKeyPath訪問一個屬性或者其它時,只用當真正運行此處的時候咱們才能發現是否有此屬性。api
b、注意點數組
[array valueForKeyPath:@「str.capitalizedString」];性能
valueForKeyPath稱爲鍵值鏈(Key Path)。鍵值鏈是用點將若干鍵相連的字符串,經過在對象上調用valueForKeyPath:或者setValue:forKeyPath:。學習
c、乾貨設計
KVC有些東西常常被忽略掉,可是很使用的小技巧。對象
我對於KVC嵌套知識點學習自一篇簡書,感受人家整理的很棒,先感謝人家,在此就厚顏無恥的引用下。字符串
文/水瓶座_iOSer(簡書做者)
原文連接:http://www.jianshu.com/p/a6a0abac1c4a
獲取數組裏的,最大、最小、平均、求和
NSArray *array = @[@"10",@"35",@72,@78,@"1"];
NSNumber *sum = [array valueForKeyPath:@"@sum.floatValue"];
NSNumber *avg = [array valueForKeyPath:@"@avg.floatValue"];
NSNumber *max = [array valueForKeyPath:@"@max.floatValue"];
NSNumber *min = [array valueForKeyPath:@"@min.floatValue"];
刪除重複數據
NSArray *array = @[@"name", @"w", @"aa", @"zxp", @"aa"]; //返回的是一個新的數組
NSArray *newArray = [array valueForKeyPath:@"@distinctUnionOfObjects.self"];
NSLog(@"%@", newArray);
一樣能夠嵌套使用,先剔除name對應值的重複數據再取值
NSArray *array = @[ @{@"title":@"zxp",@"name":@"zhangxiaoping"}, @{@"title":@"zxp2",@"name":@"zhangxiaoping2"}, @{@"title":@"zxp",@"name":@"zhangxiaoping3"}, @{@"title":@"zxp",@"name":@"zhangxiaoping"}];
//根據name字段,來進行重複刪除。
NSArray *newArray = [array valueForKeyPath:@"@distinctUnionOfObjects.name"];
//若是要根據title字段來刪除重名的寫法爲`@distinctUnionOfObjects.title`
NSLog(@"%@", newArray);
/*
print:( zhangxiaoping3, zhangxiaoping2, zhangxiaoping)是一個字符串數組*/
進行實例方法的調用
NSArray *array = @[@"name", @"w", @"aa", @"ZXPing"];
NSLog(@"%@", [array valueForKeyPath:@"uppercaseString"]);
至關於數組中的每一個成員執行了uppercaseString方法,而後把返回的對象組成一個新數組返回。既然能夠用uppercaseString方法,那麼NSString的其餘方法也能夠,好比[array valueForKeyPath:@「length"]。固然,其餘對象的實例方法也能夠以此類推來進行調用。