- KVC:Key-Value-Coding 通过存取方法,属性或直接设置实例变量来直接更改对象状态。也可以通过字符串描述来更改对象状态,这种方式称为键值编码。
- 键值编码基本调用包括setValue:ForKey:和valueForKey:两个方法
- setValue:ForKey:方法以字符串形式向对象发送消息、第一个参数为OC对象值;第二个参数为字符串,是对象的属性名称或者实例变量名称。
- valueForKey:方法以字符串形式向对象发送消息,用于获取实例变量的值。参数为字符串,是对象的属性名称后者是实例变量的名称。
- 注意:setValue:ForKey:方法首先查找的是setKey命名的setter,如果不存在则在对象内部查找_key或key的实例变量。valueForKey:方法首先查找的是key或isKey命名的getter,如果不存在,则在内部查找_key或key的实例变量。
#import"Student.h"
@implementation Student
- (NSString*)description{
return[NSStringstringWithFormat:@"Mynameis%@,Myageis%d",self.name,self.age];
}
- (void)dealloc{
[_namerelease];
[superdealloc];
}
@end
#import<Foundation/Foundation.h>
#import"Student.h"
intmain(intargc,constchar*argv[])
{
@autoreleasepool{
Student*stu=[[Studentalloc]init];
[stusetValue:@"anApple"forKey:@"name"];
// 相当于 [stusetName:@"anApple"];
[stusetValue:[NSNumbernumberWithInt:18]forKey:@"age"];
// 相当于[stusetAge:18];
NSLog(@"name:%@,age:%@",[stuvalueForKey:@"name"],[stuvalueForKey:@"age"]);
// 相当于 NSLog(@"name:%@,age:%d",stu.name,stu.age);
}
return0;
}
#import<Foundation/Foundation.h>
@interfaceEngine:NSObject
@property (retain)NSString*name;//引擎名字
@end
#import"Engine.h"
@implementation Engine
- (NSString*)description{
NSString*desc=@"我是引擎,我正在工作";
returndesc;
}
- (void)dealloc{
[_namerelease];
[superdealloc];
}
@end
#import<Foundation/Foundation.h>
#import"Engine.h"
@interface Car:NSObject
@property (retain)Engine*engine;//引擎
- (void)run;//跑的方法
@end
#import "Car.h"
@implementation Car
//跑的方法
- (void)run{
NSLog(@"%@",self.engine);
}
@end
#import<Foundation/Foundation.h>
#import "Car.h"
#import"Engine.h"
intmain(intargc,constchar*argv[])
{
@autoreleasepool{
//创建引擎对象
Engine*engine=[[Enginealloc]init];
//创建汽车对象
Car*car=[[Caralloc]init];
//给汽车装配引擎
[carsetValue:engineforKey:@"engine"];
//car对象通过键路径设置引擎的名字
[carsetValue:@"兰博基尼"forKeyPath:@"engine.name"];
//car对象通过键路径获取引擎的名字
NSLog(@"引擎是:%@",[carvalueForKeyPath:@"engine.name"]);
//释放引擎和汽车对象
[enginerelease];
[carrelease];
}
return0;
}
分别用setValue:forKeyPath:和valueForKeyPath:方法设置和获取引擎的name属性值。键路径是:engine.name。实例解释:car对象有一个Engine类型的engine,Engine对象包含了NSString类型的属性name,所以键值路径为:engine.name。