KVC OC中键值编码的概念和使用方法

一般对于数据的赋值、取值有二种方法:

1、使用setter,getter

2、通过定义公共方法来实现赋值与取值操作

下面我们来用Key-Value-Coding(KVC)键值编码来访问你要存取的类的属性。

KVC介绍

键值编码的基本概念

1、键值编码是一个用于间接访问对象属性的机制,使用该机制不需要调用存取方法和变量实例就可以访问对象属性。

2、键-值编码方法在Objective-C非正式协议(类目)NSKeyValueCoding中被声明,默认的实现方法由NSObject提供。

3、键-值编码支持带有对象值的属性,同时也支持纯数值类型和结构。非对象参数和返回类型会被识别并自动封装或者解封。

设置与访问

键值编码中的调用包括valueForKey:和setValue:forkey:这两个方法,它们以字符串的形式向对象发送消息,字符串是我们关注属性的关键。

首先定义一下Book类,代码如下

#import <Foundation/Foundation.h>
#import "Author.h"

@interface Book : NSObject
{
    @private
        NSString *_name;
        Author *_author;//作者
        NSArray *_relativeBooks;
    
        float price;
}

@end


#import "Book.h"

@implementation Book

@end

_name,price属性没有加property,同时在.m文件中没有实现,这个就不会有getter、setter方法了,需要使用kvc来进行赋值、取值


#import <Foundation/Foundation.h>

@interface Author : NSObject
{
    @private
        NSString *sex;//作者性别
}

@end

#import "Author.h"

@implementation Author

@end



调用方法如下

    Book *book=[[[Book alloc] init] autorelease];
    NSMutableString *name=[[NSMutableString alloc] initWithFormat:@"Object-c学习指南"];
    [book setValue:name forKey:@"name"];
    NSLog(@"name is :%@",[book valueForKey:@"name"]);
是否存在setter、getter方法,如果不存在,它将在内部查找名为_key或key的实例变量(如果没有程序会报错),通过KVC,可以获取不存在getter方法的对象值,无需通过对象指针直接访问。

另外我们需要注意,当我们通过setValue:forKey:设置对象的值,或通过valueForKey来获取对象值时,如若对象的实例变量为基本数据类型时,如(char、int、float、BOOL),我们需要对数据进行封装。

路径

除了通过键设置值外,键值编码还支持指定路径,像文件系统一 样,用“点”号隔开。

  Book *book=[[Book alloc] init];
    
    NSMutableString *name=[[NSMutableString alloc] initWithFormat:@"Object-c学习指南"];
    [book setValue:name forKey:@"name"];
    NSLog(@"name is :%@",[book valueForKey:@"name"]);
    
    Author *author=[[Author alloc] init];
    [author setValue:@"male" forKey:@"sex"];
    [book setValue:author forKey:@"_author"];
     NSLog(@"author sex:%@",[book valueForKeyPath:@"_author.sex"]);
    
    [book setValue:@"female" forKeyPath:@"_author.sex"];
    NSLog(@"author sex:%@",[book valueForKeyPath:@"_author.sex"]);

一对多的关系,代码如下
//一对多的关系
    NSMutableArray *relativeBooks=[NSMutableArray arrayWithCapacity:3];
    for(int i=0;i<3;i++)
    {
         Book *book=[[Book alloc] init];
        NSString *n=[NSString stringWithFormat:@"Object_c_%d",i];
        [book setValue:n forKey:@"name"];
        [relativeBooks addObject:book];
        [book release];
    }
    [book setValue:relativeBooks forKey:@"_relativeBooks"];
    NSArray *booknames=[book valueForKeyPath:@"_relativeBooks.name"];
    NSLog(@"%@",booknames);
    
    NSArray *books=[relativeBooks valueForKeyPath:@"name"];
    NSLog(@"%@",books);

KVC的简单运算,

kvc可以做一些字符简单运算。sum,min,max,avg,count,示例如下:

  Book *book=[[Book alloc] init];
     
     NSMutableArray *relativeBooks=[NSMutableArray arrayWithCapacity:3];
     for(int i=0;i<3;i++)
     {
         Book *book1=[[Book alloc] init];
         NSString *n=[NSString stringWithFormat:@"Object_c_%d",i];
         [book1 setValue:n forKey:@"name"];
         [book1 setValue:@(20+i) forKey:@"price"];
         [relativeBooks addObject:book1];
         [book1 release];
     }
     [book setValue:relativeBooks forKey:@"_relativeBooks"];
    NSString *sum=[book valueForKeyPath:@"_relativeBooks.@sum.price"];
    NSLog(@"sum:%@",sum);




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值