KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问对象的属性。功能有点类似于我们平常使用的get和set方法,直接从例子来看看比较直观吧:
定义一个Persono类,以下为.h文件
1 2 3 4 5 6 7 8 9
| #import <Foundation/Foundation.h> @class Book; @interface Person : NSObject @property (nonatomic, copy) NSString *name; @property (nonatomic, assign) NSInteger age; @property (nonatomic, assign) Book *book; @end
|
以下为.m文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #import "Person.h" @interface Person() @property (nonatomic, strong) NSString *nickName; @end @implementation Person - (instancetype)init { if (self == [super init]) { self.nickName = @"脆脆"; self.name = @"波波脆"; self.age = 18; } return self; } @end
|
再定义一个Book的类,
1 2 3 4 5 6 7 8 9 10
| #import <Foundation/Foundation.h> @interface Book : NSObject @property (nonatomic, copy) NSString *name; @property (nonatomic, assign) double price; @end
|
现在我们直接在.m里面实现调用,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #import <Foundation/Foundation.h> #import "Person.h" #import "Book.h" int main(int argc, const char * argv[]) { @autoreleasepool { Person *person = [[Person alloc]init]; NSLog(@"我叫%@",person.name); NSLog(@"我叫%@",[person name]); NSLog(@"我叫%@",[person valueForKey:@"name"]); NSLog(@"我叫%@",[person valueForKeyPath:@"name"]); NSLog(@"我的昵称叫%@",[person valueForKeyPath:@"nickName"]); Book *book = [[Book alloc]init]; book.name = @"九阴真经"; book.price = 120.30; person.book = book; NSLog(@"我的书的名字:%@",[person valueForKeyPath:@"book.name"]); } return 0; }
|
从上面的代码运行输出来看看,在1处,要取得person对象的name属性,可以通过调用get方法,也可以使用KVC,他们是等效的,而在2处,对于私有的不对外公开的内部变量,get方法就无法操作到了,而KVC依旧可以获取,(这里只演示了取值,赋值也是一样的)所以利用这一特性,对于苹果一些内容控件,比如UISearchBar,里面的一些不对外提供的属性,我们都可以复用KVO来进行读取和修改。
例1中,valueForKey和valueForKeyPath,一般情况下,他们的功能是一致的,但valueForKeyPath的特别之处还支持点语法多层嵌套的取值方式,详见例3。valueForKeyPath或以理解为valueForKey的进化版,所以一般开发中,直接都使用valueForKeyPath就可以了。
而例4中则又展现了KVC的另一种高级用法,平常对于对象组成的数组,如上面例子,我们要统计所有书的价格总和时,平时我们一般采取遍历的方式来求和,当然代码就是一坨了,而使用KVC,则只需要一行,[books valueForKeyPath:@”@sum.price”]很简洁,如果上面这个数组是person,则就变成了[person valueForKeyPath:@”books.@sum.price”],另外,它还支持平均值,最大值,最小值,以及计数,相关关键字分别为@avg,@max,@min,@count。
注:版权声明:本文为博主原创文章,未经博主允许不得转载。