KVC

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];
//1.
NSLog(@"我叫%@",person.name);
NSLog(@"我叫%@",[person name]);
NSLog(@"我叫%@",[person valueForKey:@"name"]);
NSLog(@"我叫%@",[person valueForKeyPath:@"name"]);
//2.
// NSLog(@"我的昵称叫%@",person.nickName);
NSLog(@"我的昵称叫%@",[person valueForKeyPath:@"nickName"]);
//3.
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。

注:版权声明:本文为博主原创文章,未经博主允许不得转载。