标签:
本章将分为两个部分:
类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
)
分析:
[a setValue:@"HelloWorld" forKey:@"str"];
是KVC的set方法,其中key一定要为消息接收者的属性名称,而不能是自定义的。
NSString *str = [a valueForKey:@"str"];
是KVC的get方法,其中key一定要为消息接收者的属性名称,而不能是自定义的。
[a setValue:@2015 forKey:@"value"];
NSInteger是基本数据类型,设置基本数据类型的时候,需要将基本类型转化成NSNumber,在设置值的时候,系统会有自动解包的过程,NSNumber会解包赋值给value.
NSInteger value = [[a valueForKey:@"value"] integerValue]; //id 转为 NSInteger
valueForKey返回的是id类型,id转换为NSInteger的方法应该是上面这种,而下面这种写法是错误的!
NSInteger value = (NSInteger)[a valueForKey:@"value"];
- (NSString *)description { return [NSString stringWithFormat:@"\n%@\n%li\n%@", str, (long)value, array]; } NSLog(@"%@", a);
将打印出
HelloWorld
2015
(
HearthStone,
2
)
标签:
原文地址:http://www.cnblogs.com/chenyg32/p/4803795.html