iOS KVC 是怎么通过value查找key的

96
石虎132
2017.12.09 18:26 字数 519

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄

一、概念

1.ios获取字典里的内容并不区分它到底是什么类型(数组、字符、字典等等;

2.它就是一个容器。往里面保存东西的时候,用setValue:forKey:或者setObject:forKey:。

3.就是给你所要保存的对象(value),起一个名字(key),然后set进入到字典里。

二、测试代码

测试代码:

如果访问器方法和实例变量都没有找到,执行setValue:forUndefinedKey:方法,该方法的默认实现是产生一个 NSUndefinedKeyException 类型的异常,但是我们可以重写setValue:forUndefinedKey:方法

[person setValue:@"美女"forKey:@"张琼"];

崩溃错误:

2017-12-0917:42:55.324620+0800dddd[86208:2255303] *** Terminating app due to uncaught exception'NSUnknownKeyException', reason:'[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key 张琼.'

解决方法:

在Person.m文件中重写 - (void)setValue:(id)value forUndefinedKey:(NSString *)key

- (void)setValue:(id)value forUndefinedKey:(NSString*)key

{

NSLog(@"%s",__func__);

key =@"亲";

//NSString *keyStr = key;

NSString*valueStr = value;

NSLog(@"keyStr==%@   valueStr= %@",key,valueStr);

}

再次运行程序输出结果:

2017-12-0917:47:03.794080+0800dddd[86306:2259407] -[Person setValue:forUndefinedKey:]

2017-12-0917:47:03.794206+0800dddd[86306:2259407] keyStr==亲   valueStr= 美女

如图1:

三、实例代码:

1.//**********************Person.h 类

//  Copyright © 2017年 石虎. All rights reserved.

//

#import

@interfacePerson :NSObject

@property(nonatomic,copy)NSString*name;

@property(nonatomic,assign)intage;

@end

2.//**********************Person.m 类

//  Copyright © 2017年 石虎. All rights reserved.

//

#import"Person.h"

@implementationPerson

- (void)setName:(NSString*)name

{

_name= name;

NSLog(@"name--- %s  name = %@",__func__,name);

}

- (void)setAge:(int)age

{

_age= age;

NSLog(@"age-->> %s age = %d",__func__,age);

}

//重写

- (void)setValue:(id)value forUndefinedKey:(NSString*)key

{

NSLog(@"%s",__func__);

key =@"亲";

//NSString *keyStr = key;

NSString*valueStr = value;

NSLog(@"keyStr==%@   valueStr= %@",key,valueStr);

}

@end

3.//**********************ViewController.m 类

#import"ViewController.h"

#import"Person.h"//测试 kvc

- (void)test4

{

Person*person = [[Personalloc]init];

[personsetValue:@"石虎"forKey:@"name"];

[personsetValue:@10forKey:@"age"];

[personsetValue:@"美女"forKey:@"张琼"];

//    [person valueForKey:@"name"];

//    NSLog(@"----- == %@",[person valueForKey:@"name"]);

}

4.效果图:

谢谢!!!

iOS 技术大全
Gupao