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+0800 dddd[86208:2255303] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason:'[<Person 0x6000002361a0> 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+0800 dddd[86306:2259407] -[Person setValue:forUndefinedKey:]

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


如图1:




三、实例代码:


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


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

//

#import <Foundation/Foundation.h>


@interface Person : NSObject


@property (nonatomic,copy)NSString *name;

@property (nonatomic,assign)int age;

@end


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


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

//

#import "Person.h"


@implementation Person


- (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];

    [person setValue:@"石虎"forKey:@"name"];

    [person setValue:@10forKey:@"age"];

    

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

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

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

}


4.效果图:




谢谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值