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

//联系人:石虎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.效果图:

谢谢!!!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • KVC(Key-value coding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iO...
    朽木自雕也阅读 1,620评论 6 1
  • 沙盒 Plist Preference偏好设置 NSKeyedArchiver归档 / NSKeyedUnarch...
    追风者366阅读 3,454评论 0 6
  • KCV 其实由于ObjC的语言特性,你根部不必进行任何操作就可以进行属性的动态读写,这种方式就是Key Value...
    TYM阅读 1,081评论 0 4
  • 小和尚细细观察了会,发现东南方向不远处有一缓坡,爬过去横穿几丛灌木便可到达金黄竹笋处。他翻开草药,血止住了,...
    牛二2016阅读 324评论 0 0
  • 前几周和朋友聚会,聊起情商的问题。 她秉持世上其实没有情商这东西,因为这只是人类赋予给它的意义,人的情商并无高低,...
    扫地_阅读 208评论 3 9