Objective-C高级编程——KVC(一)

【基本概念】

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

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

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


【键值访问】

  键值编码中的基本调用包括-valueForKey: 和 -setValue:forkey: 这两个方法,它们以字符串的形式向对象发送消息字符串是我们关注属性的关键。下面是我演示的一个简单的例子:

(1)新建一个Book类,在头文件中加入如下属性:

@property(strong,nonatomic) NSString *name;


(2)在main.m中实现如下:

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

int main(int argc, const char * argv[]) {
  @autoreleasepool {

    
    Book *book = [[Book alloc] init];
    [book setValue:@"老人与海" forKey:@"name"];
    
    NSLog(@"这本书的名字是:%@",[book valueForKey:@"name"]);
    
    
    
  }
    return 0;
}

(3)输出结果如下:


是否存在setter、getter方法,如果不存在,他将在内部查找名为_key或key的实例变量。通过KVC,可以获取不存在getter方法的对象值,无需通过对象指针直接访问。这里我们需要注意,当我们通过setValue:forKey:设置对象的值,或通过valueForKey来获取对象的值时,若对象的实例变量为基本数据类型时(char,int,float,BOOL),我们需要对数据进行封装。


【路径访问】

     除了通过键设置外,键值编码还支持指定路径,像文件系统一样。用“点”号隔开。下面我给大家演示一个程序:

(1)新建一个Book类,在.h头文件中如下:

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

@interface Book : NSObject

@property(strong,nonatomic) NSString *name;

@property(strong,nonatomic) Author *author;

@end

(2)新建一个Author类,在.h头文件中如下:

#import <Foundation/Foundation.h>

@interface Author : NSObject

@property(strong,nonatomic) NSString *authorName;

@end

(3)在main.m文件中实现如下:

#import <Foundation/Foundation.h>
#import "Book.h"
//这里不再需要引入Author.h头文件了,该头文件已经在Book.h中引入了。

int main(int argc, const char * argv[]) {
  @autoreleasepool {

    
    Book *book = [[Book alloc] init];
    [book setValue:@"老人与海" forKey:@"name"];
    
    
    Author *author = [[Author alloc] init];
    [author setValue:@"海明威" forKey:@"authorName"];
    
    
    [book setValue:author forKey:@"author"];
    
    NSLog(@"这本书的名字是:%@",[book valueForKey:@"name"]);
    NSLog(@"这本书的作者是:%@",[book valueForKeyPath:@"author.authorName"]);
    
    
    [book setValue:@"是海明威吗?" forKeyPath:@"author.authorName"];
    NSLog(@"这本书的作者是:%@",[book valueForKeyPath:@"author.authorName"]);

    
  }
    return 0;
}

(4)输出结果如下:




【KVC的简单运算】

     此外,还可以应用一些字符做简单运算。sum,min,max,avg,count


【基本数据类型的封装】

KVC中的setValue: forKey: 方法和valueForKey:方法不能直接对基本数据类型进行操作,需要进行包装,示例代码如下:

#import <Foundation/Foundation.h>
#import "Book.h"
//这里不再需要引入Author.h头文件了,该头文件已经在Book.h中引入了。

int main(int argc, const char * argv[]) {
  @autoreleasepool {

    
    Book *book = [[Book alloc] init];
    [book setValue:[[NSNumber alloc] initWithFloat:12.8] forKey:@"price"];//要在这里进行包装;

    NSLog(@"书本的价格是:%@",[book valueForKey:@"price"]);
    
  }
    return 0;
}



github主页:https://github.com/chenyufeng1991  。欢迎大家访问!












评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值