码迷,mamicode.com
首页 > 其他好文 > 详细

KVC/KVO之暴力的KVC

时间:2015-09-12 23:39:50      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:

本章将分为两个部分:

  • KVC之Set/Get
  • KVC之键值路径

KVC之Set/Get

类A中有3个变量,都是private权限,关于访问权限的,请参见《Objective-C 成员变量

A.h

@interface A : NSObject
{
@private
    NSString *str;
    NSInteger value;  //注意这里没星号哦哦哦
    NSArray *array;
}
@end

 

A.m:重写Description函数,用于NSLog

@implementation A
/**
 *    重写Description方法,可用于NSLog打印
 */
- (NSString *)description
{
    return [NSString stringWithFormat:@"\n%@\n%li\n%@", str, (long)value, array];
}
@end

 

Main.m:理论上来说,外部变量是访问不到这3个私有变量的,但是暴力的KVC来了。

A *a = [[A alloc] init];

//KVC之set
[a setValue:@"HelloWorld" forKey:@"str"];
[a setValue:@2015 forKey:@"value"];
[a setValue:@[@"HearthStone", @2] forKey:@"array"];

NSLog(@"%@", a);

//KVC之get
NSString *str = [a valueForKey:@"str"];
NSInteger value = [[a valueForKey:@"value"] integerValue];  //id 转为 NSInteger
NSArray *array = [a valueForKey:@"array"];

NSLog(@"\n%@\n%ld\n%@", str, (long)value, array);

 

输出为

HelloWorld
2015
(
HearthStone,
2
)

HelloWorld
2015
(
HearthStone,
2
)

 

分析:

KVC的Set方法(重点)

[a setValue:@"HelloWorld" forKey:@"str"];

是KVC的set方法,其中key一定要为消息接收者的属性名称,而不能是自定义的。

 

KVC的GET方法(重点)

NSString *str = [a valueForKey:@"str"];

是KVC的get方法,其中key一定要为消息接收者的属性名称,而不能是自定义的。

 

当Set方法遇到基本数据类型

[a setValue:@2015 forKey:@"value"];

NSInteger是基本数据类型,设置基本数据类型的时候,需要将基本类型转化成NSNumber,在设置值的时候,系统会有自动解包的过程,NSNumber会解包赋值给value.

 

当Get方法遇到基本数据类型

NSInteger value = [[a valueForKey:@"value"] integerValue];  //id 转为 NSInteger

valueForKey返回的是id类型,id转换为NSInteger的方法应该是上面这种,而下面这种写法是错误的!

NSInteger value = (NSInteger)[a valueForKey:@"value"];

 

题外话:重写Description来方便NSLog的输出

- (NSString *)description
{
    return [NSString stringWithFormat:@"\n%@\n%li\n%@", str, (long)value, array];
}

NSLog(@"%@", a);

将打印出

HelloWorld
2015
(
HearthStone,
2
)

 

KVC之键值路径

 

KVC/KVO之暴力的KVC

标签:

原文地址:http://www.cnblogs.com/chenyg32/p/4803795.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!