1. KVC简介
- 键/值编码中的基本调用是
-valueForKey:和-setValue:forKey:方法2. KVC键路径1
2
3
4
5NSString *name = [car valueForKey:@"name"];
valueForKey:会首先查找以参数名命名(格式为_name或_isName)的getter方法
如果没有这样的getter方法,它将会在对象内寻找名称格式为_name或name的实例变量
另外KVC会自动装箱和开箱标量值,也就是说,当使用-setValue:forKey:,它自动将标量值(int、float和struct)放入NSNumber或NSValue中;
当时用-valueForKey:时,它自动将标量值从这些对象中取出,仅KVC具有这种自动装箱功能,常规方法调用和属性语法不具备该功能 - 键路径的基本调用是
-valueForKeyPath:和-setValue:forKeyPath:方法3. KVC快速运算1
2[car setValue:[NSNumber numberWithInt:155] forKeyPath:@"engine.horsepower"];
NSLog(@"horsepower is %@", [car valueForKeyPath:@"engine.horsepower"]); - 键路径不仅能引用对象值,还可以引用一些运算符来进行一些运算,例如能获取一组值的平均值或返回这组值中的最小值和最大值4. setter和getter方法命名规则
1
2
3
4
5[garage valueForKeyPath:@"cars.@count"];
[garage valueForKeyPath:@"cars.@sum.mileage"];
[garage valueForKeyPath:@"cars.@avg.mileage"];
[garage valueForKeyPath:@"cars.@min.mileage"];
[garage valueForKeyPath:@"cars.@max.mileage"]; setter方法根据它所更改的属性名称来命名,并加上前缀set,如:setName: 、setEngine:等getter方法则是以其返回的属性名称命名,如:name、engine等,不要将get用作getter方法的前缀- 补充知识:
get这个词在Cocoa中有着特殊的含义,如果get出现在Cocoa的方法名称中,就意味着这个方法会将你传递的参教作为指针来返回数值。例如,NSData中有一个getBytes:方法,它的参数就是用来存储字节的内存缓冲区的地址。如果你在存取方法的名称中使用了get,那么有经验的Cocoa编程人员就会习惯性地将指针当做参数传入这个方法,当他们发现这不过是一个简单的存取方法时就会感到困惑
5. setValue和setObject的区别
setObject:ForKey:是NSMutableDictionary特有的;setValue:ForKey:是KVC的主要方法- 总结两者的区别:
setObject: forkey:中object是不能够为nilsetValue: forKey:中value能够为nil,但是当value为nil的时候,会自动调用removeObject: forKey:方法setValue: forKey:中key的参数只能够是NSString类型setObject: forKey:的key可以是任何类型- 注意:
setObject: forKey:对象不能存放nil要与下面的这种情况区分:[imageDictionary setObject:[NSNullnull] forKey:indexNumber];[NSNull null]表示的是一个空对象,并不是nil - 当
setValue: forKey:方法调用者是对象的时候,setValue: forKey:方法是在NSObject对象中创建的,也就是说所有的OC对象都有这个方法,所以可以用于任何类
6. 正确比较字符串
- 比较字符串是否相等,应该使用
isEqualToString:,而不能仅仅比较字符串的指针值;==运算符只判断两个字符串的指针数值,而不是它们所指的对象