OC中的KVC

看官们,我们在前面章回中介绍了Foundation框架中的日期操作,本章回中将介绍OC中的KVC。

我们说的KVC是Key Value Codeing的缩写,它是OC中操作类属性的一种方式,它是在NSObject中实现的,通常情况下我们定义的类只需要继承NSObject类就可以通过KVC来操作类的属性。如果想了解更加详细的知识,可以在官方文档中搜索NSKeyValueCoding相关的内容。


KVC对类中属性的操作主要有两种,下面是具体的操作以及实现该操作时需要使用的方法


1.修改类中的属性值


- (void)setValue:(id)value forKey:(NSString *)key;


注意参数value是类类型,不管属性是int等基本类型还是类类型,都需要使用类类型的对象给属性赋值;


2.获取类中的属性值


- (id)valueForKey:(NSString *)key;


注意方法的返回值是类类型,不管属性是int等基本类型还是类类型,通过该方法获取到属性值都是类类型;


其实我们使用setter和getter方法也可以操作属性,OC提供KVC这种方式操作属性只是显得更加灵活方便一些,不过性能比较低,因为它是间接调用setter/getter方法来操作属性的。

使用KVC时要注意key需要与类中的属性名保持一致,如果不一致会在运行时发生异常:NSUnknownKeyException。这点需要注意,因为编译时没有报错,但是运行时却出错了。

接下来我们通过具体的代码来演示如何使用KVC

#include<Foundation/Foundation.h>

//定义一个名叫Person的类并且实现该类
@interface Person : NSObject
@property NSString *name;
@property int age;

-(void) print;
@end

@implementation Person
@synthesize name;
@synthesize age;

-(void) print 
{
	NSLog(@"Person name: %@, age: %d",name,age);
}
@end

int main()
{
	Person * p1 = [[Person alloc] init];
	Person * p2 = [[Person alloc] init];
	//通过setter方法给类的属性赋值,通过getter方法获取类的属性值
	[p1 setName:@"ZhangSan"];
	[p1 setAge:26];
	[p1 print];
	NSLog(@"p1: name: %@, age: %d",[p1 name],[p1 age]);

	//通过KVC方法给类的属性赋值,并且获取类的属性值
	[p2 setValue:@"LiSi" forKey:@"name"];
	[p2 setValue:@"LiSi" forKey:@"aname"];
	[p2 setValue:[NSNumber numberWithInt:33] forKey:@"age"];
	[p2 print];
	NSLog(@"p2: name: %@, age: %@",[p2 valueForKey:@"name"],[p2 valueForKey:@"age"]);
}


在代码中我们添加了相关的注释,以方便大家理解代码。程序中的内容不是很多,因此就不列出程序运行结果了。

最后我们对本章回的内容做一个总结:

  • 1.只需要继承NSObject就可能实现KVC;
  • 2.KVC使用比较灵活,但是性能相对比较低;
  • 3.如果属性值错误(没有与key匹配的属性)编译正常,但是会有运行时异常;


看官们,本章回的内容就介绍到这里,欲知后事如何且听下回分解!

猜你喜欢

转载自blog.csdn.net/talk_8/article/details/121642585
KVC