//
// main.m
// 处理不存在的key和处理nil值
//
// Created by Goddog on 15/1/3.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
/*
1.处理不存在的key:(1)如果操作属性时即没有对应的setter和getter方法,也不存在对应的成员变量。
(2)KVC自动调用setValue:forUndefinedKey:和valueForUndefinedKey: 方法。
(3)通过重新方法处理机制即可。
2.处理nil值:(1)如果属性基本类型是(int、float、double)且传入对应的参数,如果设置一个nil,就异常。
(2)KVC自动调用setNilValueForKey方法实现
(3)通过重新方法处理机制即可。
*/
#import <Foundation/Foundation.h>
//接口部分
@interface Item : NSObject
//使用@property 定义两个成员变量
@property (nonatomic,copy) NSString* name;
@property (nonatomic,assign) int price;
@end
//实现部分
@implementation Item
//重写setValue:forUndefinedKey:方法,处理不存在的key赋值问题
-(void) setValue:(id)value forUndefinedKey:(NSString *)key
{
NSLog(@"您尝试设置的key: %@ 不存在",key);
NSLog(@"您尝试设置的value: %@",value);
}
//重写valueForUndefinedKey:方法,处理不存在的key获值问题
//-(void) valueForUndefinedKey: (id)key
//{
// NSLog(@"您尝试访问的key:%@并不存在",key);
//}
//重写setNilValueForKey方法来处理设置nil问题
-(void) setNilValueForKey:(NSString *)key
{
//如果设置为空的话就处理
if([key isEqualToString:@"price"])
{
//设置为0
_price = 0;
}
else
{
//回调默认的方法
[super setNilValueForKey:key];
}
}
@end
//测试部分
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建对象
Item* item = [[Item alloc] init];
//无key
[item setValue:@"时间" forUndefinedKey:@"time"];
//[item valueForKey:@"time"];
//设nil
[item setValue:nil forKey:@"name"];
[item setValue:nil forKey:@"price"];
NSLog(@"名字是:%@, 价格是:%@",[item valueForKey:@"name"],[item valueForKey:@"price"]);
}
return 0;
}