您的位置:首页 > 其它

初识Objecive-C 之 键值编码(KVC)

2013-10-24 18:19 435 查看
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

学生类具有姓名、年龄两个属性,重写了父类的description方法和dealloc方法。

#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;
}

-----------------------------------------------------------------------------------------------------------------------------------------------

键路径:

键值编码支持指定键路径,对于对象中实例变量或属性是灵位一对象的情况非常实用。假设a对象下有一个B类型的属性b,而b对象中包含了C属性的属性c,如果想要从a获取c属性的内容需要使用路径描述:b.c;使用setValue:forKeyPath:和valueForKey:方法来访问键路径。

#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

引擎类具有名字属性,重写了父类的description方法和dealloc方法。

+++++++++++++++

#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。

小知识点:
骆驼命名法:(又称驼峰命名法)当变量名和方法名由一个或者多个单词练成在一起而构成唯一识别字时,除了第一个单词以小写字母开始,其他单词的首字母都是大写,例如myFirstTimes,这样的名字看上去就像驼峰一样此起彼伏,故得名。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: