iOS KVC

212 阅读3分钟

1. KVC简介

  • 键/值编码中的基本调用是-valueForKey:-setValue:forKey:方法
NSString *name = [car valueForKey:@"name"];
valueForKey:会首先查找以参数名命名(格式为_name或_isName)的getter方法
如果没有这样的getter方法,它将会在对象内寻找名称格式为_name或name的实例变量
另外KVC会自动装箱和开箱标量值,也就是说,当使用-setValue:forKey:,它自动将标量值(int、float和struct)放入NSNumber或NSValue中;
当时用-valueForKey:时,它自动将标量值从这些对象中取出,仅KVC具有这种自动装箱功能,常规方法调用和属性语法不具备该功能

2. KVC键路径

  • 键路径的基本调用是-valueForKeyPath:-setValue:forKeyPath:方法
[car setValue:[NSNumber numberWithInt:155] forKeyPath:@"engine.horsepower"];
NSLog(@"horsepower is %@", [car valueForKeyPath:@"engine.horsepower"]);

3. KVC快速运算

  • 键路径不仅能引用对象值,还可以引用一些运算符来进行一些运算,例如能获取一组值的平均值或返回这组值中的最小值和最大值
[garage valueForKeyPath:@"cars.@count"];
[garage valueForKeyPath:@"cars.@sum.mileage"];
[garage valueForKeyPath:@"cars.@avg.mileage"];
[garage valueForKeyPath:@"cars.@min.mileage"];
[garage valueForKeyPath:@"cars.@max.mileage"];

4. setter和getter方法命名规则

  • 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是不能够为nil
  • setValue: forKey:value能够为nil,但是当valuenil的时候,会自动调用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:,而不能仅仅比较字符串的指针值;==运算符只判断两个字符串的指针数值,而不是它们所指的对象

附:我的博客地址