setObject forKey 和 setValue forKey
setObject:ForKey:
是NSMutableDictionary
特有的嘹狞;
setValue:ForKey:
是KVC
的主要方法顺献;
// setObject:ForKey:中object對象不能為nil,不然會報錯,key的參數(shù)只要是對象就可以渠缕,并局限于 NSString;
[dict setObject:nil forKey:@"key"]; //崩潰锣尉!
// setValue:ForKey:中Value值可以為nil通熄,此時會自動調用removeObject:forKey:方法更耻;key的參數(shù)只能是NSString類型;
[dict setValue:nil forKey:@"key"]; // 不會蹦罚渐,自動調用removeObject:forKey方法
nil與null是不同的,[NSNull null]表示是一個空的對象,并不是nil却汉;
·setValue:ForKey·:是在NSObject對象中創(chuàng)建的,即所有的對象都有這個方法,可以用于任何類(方法調用者是對象的時候);
總結:
所以使用的時候為了安全盡量使用setValue
,還可以對setObject中的object使用宏定義替換荷并,如果值為nil則使用如下宏定義替換成@""
//NSString nil --> @""
#define NilString(a) (((a)==nil)?@"":(a))
[dict setObject:NilString(nil) forKey:@"key"];
objectForKey:和valueForKey:取值區(qū)別與聯(lián)系
NSDictioary取值的時候有兩個方法,objectForKey:
和valueForKey:
(建議用objectForKey:)
1.若key值不是以@符合開頭, 兩者是相同的合砂;
2.若key值是以@開頭, 例如:@“key”,則valueForKey:會去掉@,然后用剩下的部分執(zhí)行[super valueForKey];
3.例子:
Person *person = [Person alloc] init];
person.name = @"Leo;
則通過:[person valueForKey:@“name”];
取出的值是Leo源织。這是KVC的方法翩伪。
4.valueForKey:
取值是找和指定key同名的property accessor(屬性訪問)
沒有找到的時候執(zhí)行valueForUndefinedKey:
方法微猖,而valueForUndefinedKey:
方法默認是拋出crash
異常;
兩者都是鍵值對應缘屹,區(qū)別是valueforkey 只允許使用NSString類型凛剥,objectforkey可以是任意類型.
valueForKeyPath
NSArray *array = @[@"name", @"w", @"aa", @"jimsa"];
NSLog(@"%@", [array valueForKeyPath:@"uppercaseString"]);
// 輸出(NAME,W,AA,JIMSA)
相當于數(shù)組中的每個成員執(zhí)行了`uppercaseString`
//對NSNumber數(shù)組快速計算數(shù)組求和、平均數(shù)轻姿、最大值犁珠、最小值
NSArray *array = @[@1, @2, @3, @4, @10];
NSNumber *sum = [array valueForKeyPath:@"@sum.self"];
NSNumber *avg = [array valueForKeyPath:@"@avg.self"];
NSNumber *max = [array valueForKeyPath:@"@max.self"];
NSNumber *min = [array valueForKeyPath:@"@min.self"];
// 指定輸出類型
NSNumber *sum = [array valueForKeyPath:@"@sum.floatValue"];
// 剔除重復數(shù)據(jù)
NSArray *array = @[@"name", @"w", @"aa", @"jimsa", @"aa"];
NSLog(@"%@", [array valueForKeyPath:@"@distinctUnionOfObjects.self"]);
//直接改變對象隱藏屬性的值
[searchField setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];
//比起重寫 - (void)drawPlaceholderInRect:(CGRect)rect; 要方便太多!