一. 先说下setObject forKey 和 setValue forKey
1.setObject:ForKey:
是NSMutableDictionary
特有的;setValue:ForKey:
是KVC
的主要方法;
2.setObject:ForKey:
中object
对象不能为nil
,不然会报错;key
的参数只要是对象就可以,并局限于 NSString
; setValue:ForKey:
中Value
值可以为nil
,此时会自动调用removeObject:forKey:
方法;key
的参数只能是NSString
类型;
3.nil
与null
是不同的,[NSNull null]
表示是一个空的对象,并不是nil;
4.setValue:ForKey:
是在NSObject
对象中创建的,即所有的对象都有这个方法,可以用于任何类(方法调用者是对象的时候);
二:objectForKey:
和valueForKey:
取值区别与联系
NSDictioary
取值的时候有两个方法,objectForKey:
和valueForKey:
(建议用objectForKey:
)
1.若key
值不是以@符合开头, 两者是相同的;
2.若key值是以@开头, 例如:@“@key”,
则valueForKey:
会去掉@,然后用剩下的部分执行[super valueForKey];
3.例子:
Person *person = [Person alloc] init]; person.name = @"Leo;
则通过:[person valueForKey:@“name”];取出的值是Leo。这是KVC的方法。
4.valueForKey:
取值是找和指定key
同名的property accessor(属性访问)
没有找到的时候执行valueForUndefinedKey:
方法,而valueForUndefinedKey:
方法默认是抛出crash
异常;
两者都是键值对应,区别是valueforkey
只允许使用NSString
类型,objectforkey
可以是任意类型.
三:valueForKeyPath 非常的强大
(1)执行方法NSArray *array = @[@"name", @"w", @"aa", @"jimsa"];
NSLog(@"%@", [array valueForKeyPath:@"uppercaseString"]);
输出
(NAME,W,AA,JIMSA)
相当于数组中的每个成员执行了`uppercaseString`
方法,然后把返回的对象组成一个新数组返回。既然可以用`uppercaseString`(2)执行数学算法(2.1)对NSNumber
数组快速计算数组求和、平均数、最大值、最小值
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"];
(2.2)指定输出类型NSNumber *sum = [array valueForKeyPath:@"@sum.floatValue"];
(2.3)剔除重复数据
NSArray *array = @[@"name", @"w", @"aa", @"jimsa", @"aa"];
NSLog(@"%@", [array valueForKeyPath:@"@distinctUnionOfObjects.self"]);
(4)直接改变对象隐藏属性的值
改变UITextfiedl
的placeholder
的颜色[searchField setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];