这一次咱们来讲讲KVC(Key-Value Coding)和KVO(Key-Value Observing),即键值编码和键值观察。
首先咱来建立一个工程:
点iOS(Application)—选择Single View Application —next
输入Product Name (先讲讲KVC)跟创建OC一样的后面
创建好后,大概是这样:
我们再创建两个类,一个Book类,一个Student类:
(command+N)
点iOS(Source)—选择Cocoa Touch Class——next———后面步骤不讲啦,一样的
KVC(键值编码 Key-Value Coding)
KVC提供了一种在运行时而非编译时动态访问对象属性与实例变量的方式。
咱来举个栗子:
我们先到Student.h文件输入以下代码:
#import "Book.h"//导入Book头文件(后面解释)
@interface Student : NSObject
{
@public
NSString *_name; //学生姓名
NSUInteger _age; //学生年龄
Book *_book; //把书作为学生的属性
}
@property (nonatomic,strong)NSString *address; //学生地址
//定义一个p1
@property (assign ,nonatomic)int p1;
//定义一个p2
@property (assign ,nonatomic)int p2;
//定义一个p3
@property (assign ,nonatomic)int p3;
//给Book一个名字
@property (assign ,nonatomic)Book *bookName;
//方法,KVC的应用
-(int)getValuePropertyName:(NSString *)name;
//方法,KVC的应用
-(int)getNewValuePropertyName:(NSString *)name;
去到Student.m中实现一下:
-(NSString *)description{ //描述
return [NSString stringWithFormat:@"My name is %@,%lu years old,living in %@",_name,_age,_address];
}
//下面这个就是为了实现根据传入的字符串进行判断,从而返回相应的值
-(int)getValuePropertyName:(NSString *)name{
if ([name isEqualToString:@"p1"] ) {
return _p1;
}
else if([name isEqualToString:@"p2"])
{
return _p2;
}
else if([name isEqualToString:@"p3"]){
return _p3;
}
return 0;
}
-(int)getNewValuePropertyName:(NSString *)name{
NSNumber *pNumber = [self valueForKey:name]; //取值
return [pNumber intValue]; //拆包
}
再去到Book.h文件中,咱们定义一个书名:
{
NSString *_bookName;
}
Book.m暂且不管。咱去到 ViewController.m,首先导入头文件Student和Book,接着参考以下代码:
Student *stu1 = [Student new]; //创建一个stu1的对象
//setValue...forKey 就是以字符串形式向对象发送消息,可以设置对象实例变量的值
[stu1 setValue:@"Jason" forKey:@"_name"];
[stu1 setValue:@18 forKey:@"_age"];
[stu1 setValue:@"CZ" forKey:@"_address"];
NSLog(@"%@",stu1);
//访问
//valueForKey 就是以字符串形式向对象发送消息,用于获取对象中实例变量的值
NSString *name = [stu1 valueForKey:@"_name"];
NSNumber *age = [stu1 valueForKey:@"_age"];
NSString *address = [stu1 valueForKey:@"_address"];
NSLog(@"name = %@,age = %@,address = %@",name,age,address);
//动态访问某些属性时,使用一些可以运行时而不是编译时改变的值
stu1.p1 = 1;
stu1.p2 = 2;
stu1.p3 = 3;
//以下两个进行对比,NewValue显然可以省略上面Student.m中的if的判断,直接取值拆包即可。
int a = [stu1 getValuePropertyName:@"p1"];
NSLog(@"%d",a);
int b = [stu1 getNewValuePropertyName:@"p1"];
NSLog(@"%d",b);
Book *book =[Book new]; //创建Book对象
// [b1 setValue:<#(id)#> forKey:<#(NSString *)#>]
//键路径编码
//setValue...forKeyPath和valueForKeyPath 就是来访问键路径
[stu1 setValue:book forKeyPath:@"_book"];//取书的名字
[stu1 setValue:@"老人与海" forKeyPath:@"_book._bookName"];
NSString *bookName = [stu1 valueForKeyPath:@"_book._bookName"];
NSLog(@"bookName = %@",bookName);
}
对了,咱们还要选个手机先:
点上方的Product—>Destination—>:
这个根据自己需要选择一个吧!~我选了iphone6
然后,咱们来运行一下,运行结果如下: