KVC基本使用

首先,创建两个类。person类和book类。如图:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

接着代码来将Main.h中

//
//  Created by 胡双飞 on 15/8/15.
//  Copyright (c) 2015年 HSF. All rights reserved.
//

/** (键/值编码)
 *  KVC的基本用法:以字符串的形式(关注属性的key)向对象发送消息,查找是否有存在setter
 *                  getter方法,假设不存在,查找_key或key的实例变量,能够设置值。

*                  同一时候。通过kvc,也能够获取不存在getter方法的对象值。不须要对象指针
 *                  指向直接訪问。(能够设置对象属性的值。也能够获取对象属性的值)
 *  以下的数字和代码中的数字标识的代码样例一致。

*  1.通过 setValue: forkey: 来设置对象的值(单个设置).假设是int、float、BOOL等基本
 *                          数据类型时。要封装简单能够用 @ 来搞定。
 *
 *  2.通过 valueForKey:  获取对象的值。
 *
 *  3.通过 valueForKeyPath: 能够通过 英文的点 . 訪问到路径指向的值。
 *
 *  4.通过valueForKeyPath:能够訪问存储到数组中的每一个对象的值,接受时也要用NSArray来接受
 *
 *  5.通过setValue: forKeyPath: 也能够将訪问到路径上的实例对象设值
 *
 *  6.通过dictionaryWithValuesForKeys:(NSArray *)keys  能够通过多个key获取属性值,
 *    并以key-value形式存放到字典中。

*
 *  7.setValuesForKeysWithDictionary:能够通过字典直接给多个属性设值,经常使用字典转模型中
 *
 */

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Book.h"
//kvc和数组的基本关系
void kvcWithArray();
int main(int argc, const char* argv[])
{
    @autoreleasepool
    {
        //建立一个书类
        Book* book = [[Book alloc] init];
        book.name = @"西游记";
        //建立人
        Person* person = [[Person alloc] init];
        person.name = @"pig";
        person.book = book;

        //person.age = 5;
        //1.当是int,float,BOOL基本数据类型时。要进行封装.
        [person setValue:@5 forKey:@"age"];
        NSLog(@"%zd", person.age);

        //2.通过valueForKey:取值将值从对象解析成NSInterager类型
        NSInteger age = [[person valueForKey:@"age"] integerValue];
        NSLog(@"%ld", age);

        //3.valueForKeyPath基本运算 (方式一)
        NSString* bn = [person valueForKeyPath:@"book.name"];
        NSLog(@"%@", bn);
        //方式二
        [person.book valueForKeyPath:@"name"];
        NSLog(@"%@", person.book.name);

        //4.和数组的关系
        kvcWithArray();

        //5.通过setValue: forKeyPath: 方法来设置值。
        Person* pn = [[Person alloc] init];
        [pn setValue:@"xishi" forKeyPath:@"name"];
        [pn setValue:@"25" forKeyPath:@"age"];
        [pn setValue:@"春秋战国" forKeyPath:@"book.name"];

        //取值
        NSString* nameKeyPath = [pn valueForKeyPath:@"name"];
        NSInteger ageKeyPath = [[pn valueForKeyPath:@"age"] integerValue];
        NSString* bookKeyPath = [person valueForKeyPath:@"book.name"];
        NSLog(@"名字 %@", nameKeyPath);
        NSLog(@"年龄 %zd", ageKeyPath);
        NSLog(@"书名字 %@", bookKeyPath);

        //6.dictionaryWithValuesForKeys: 的使用,能够将数据直接放到字典里。

@[ @"name" ,还能够放其它值]
        NSDictionary* dict = [pn dictionaryWithValuesForKeys:@[ @"age", @"name" ]];
        NSLog(@"-------%@", dict);

        //7.setValuesForKeysWithDictionary:能够通过字典直接给多个属性设值。

Person* vkd = [[Person alloc] init];
        [vkd setValuesForKeysWithDictionary:dict];
        NSLog(@"名字 %@", vkd.name);
        NSLog(@"年龄 %zd", vkd.age);
        NSLog(@"书名字 %@", vkd.book.name);
        /*
         2015-08-17 11:20:42.325 02-KVC[656:33512] 名字 xishi
         2015-08-17 11:20:42.325 02-KVC[656:33512] 年龄 25
         2015-08-17 11:20:42.326 02-KVC[656:33512] 书名字 (null)
         */
        //这里输出结果中书名字为空,原因是我在第六中的字典中没有赋值。
        //(1)用kvc时,能够少值,不能多值,假设多值会出现程序崩溃。

//(2)在字典转模型时,
        //   在模型类的.m文件,放上-(void)setValue:(id)value forUndefinedKey:(NSString *)key{}
        //   方式来处理,当你的值多时就会来到这种方法。而且能够通过获取多值的属性.
    }
    return 0;
}

void kvcWithArray()
{
    Person* p = [[Person alloc] init];
    p.name = @"tangsen";
    p.age = 30;

    Person* p1 = [[Person alloc] init];
    p1.name = @"sunwukong";
    p1.age = 40;

    Person* p2 = [[Person alloc] init];
    p2.name = @"shaheshag";
    p2.age = 20;

    // 笨的方法将人名加入到数组中。

//            NSMutableArray *names = [NSMutableArray array];
    //            for (Person *person in persons) {
    //                [names addObject:person.name];
    //            }

    //(1)创建的三个人加到数组中.
    NSArray* persons = @[ p, p1, p2 ];

    // 通过 valueForKeyPath, 取出persons数组中全部person对象的name属性值
    NSArray* names = [persons valueForKeyPath:@"name"];

    NSLog(@"%@", names);
}
时间: 2024-07-29 07:38:51

KVC基本使用的相关文章

0124——KVC KVO模式

1.KVC KVC是Key-Value-Coding的简称,它是一种可以直接通过字符串的名 字(key)来访问类属性(实例变量)的机制.而不是通过调用Setter.Getter方法访问.当使用KVO.Core Data.CocoaBindings.AppleScript(Mac支持)时,KVC是关键技术.  Person * xw = [[Person alloc]init]; Dog *dg = [[Dog alloc]init]; //使用kvc设置成员变量的值 //使用之前必须得知道变量的

iOS开发——实用篇&amp;KVO与KVC详解

KVO与KVC详解 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听(KVO)特性: 键值编码KVC 键值监听KVO 键值编码KVC 我们知道在C#中可以通过反射读写一个对象的属性,有时候这种方式特别方便,因为你可以利用字符串的方式去动态控制一个对象.其实由于ObjC的语言特性,你根部不必进行任何操作就可以进行属性的动态读写,这种方式就是Key Valu

【非凡程序员】 OC第九节课 (KVC的运算)

买粽子的例子,主要输练习KVC的应用,(注意:必须建立一个数组,才能使用KVC的运算)详细代码如下: 1.main函数代码: #import <Foundation/Foundation.h> #import "Person.h" #import "zongZi.h" int main(int argc, const char * argv[]) {     @autoreleasepool {         // insert code here..

初识MVC和KVC

简单MVC M---model:模型,相当于饭馆里的厨师,厨师提供他会的菜式给老板,老板不会关心他是怎么去做的. V---view:视图,相当于饭馆里的服务员,服务员从老板那里拿到菜单,提供给客户. C---controller:控制器,相当于饭馆里的老板.老板从厨师那里得到菜式,弄成菜单提供给服务员处. KVC--是一种键值编码,通过键值间接编码 K---key:键 V---value值 C---coding:编码 使用说明: 1.使用KVC间接修改对象属性时,系统会自动判断对象属性的类型,并

OC学习篇之---KVC和KVO操作

前一篇文章我们介绍了OC中最常用的文件操作:http://blog.csdn.net/jiangwei0910410003/article/details/41875015,那么今天来看一下OC中的一个比较有特色的知识点:KVC和KVO 一.KVC操作 OC中的KVC操作就和Java中使用反射机制去访问类的private权限的变量,很暴力的,这样做就会破坏类的封装性,本来类中的的private权限就是不希望外界去访问的,但是我们这样去操作,就会反其道而行,但是我们有时候真的需要去这样做,哎.所以

iOS 中KVC、KVO、NSNotification、delegate 总结及区别

iOS 中KVC.KVO.NSNotification.delegate 总结及区别 1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的关键技术之一. Demo: @interface myPerson : NSObject { NSString*_name; int      _age; int      _height; int      _w

NotificationCenter KVC KVO Delegate总结

KVO(Key-Value- Observing): 一对多, 观察者模式,键值观察机制,它提供了观察某 一属性变化的方法,极大简化了代码. KVO底层实现: - kvo 是基于 runtime 机制实现 - 使用了 isa 混写 isa-swizzling ,当一个对象( 假设是person对象,   person的类是MYPerson)的属性值(假设 person 的 age 属性)发生改变时,系统会自动生成一个类,继承自  MYPerson : NSKVONotifying_MYPerso

iOS开发UI篇—KVC简单介绍

一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observer 键值观察.监听某一个模型的属性,只要模型属性的值一变化就通知你. 二.使用KVC 1.KVC基本使用介绍 (1)代码示例: 新建一个命令行项目,用以演示KVC的用法 完成之后为项目添加一个Person类. 为Person类添加两个属性(name和age),注意这两个属性的类型. 1 #import <Foundation/Fo

K-V-C 键值观察机制

在两个不同的控制器之间传值是iOS开发中常有的情况,应对这种情况呢,有多种的应对办法.kvc就是其中的一种,所以,我们就在此解释之.   key value observing  键值观察,给人一种高冷的感觉,其实,我们可以用一个通俗的例子来解释之.就拿美俄之间的间谍来举例子.美俄是两个各自独立的国家,但是为了各自的利益,彼此之间勾心斗角,不断的爆出间谍丑闻.打住!从政治的深渊回到技术层面O(∩_∩)O.美国想知道俄罗斯的最新的导弹技术,于是派间谍收集情报,(kvo的第一步:注册观察者-美国,监

字典转模型KVC和runtime二者实现与区别

我们知道在开发中,字典转模型是一种很常用的设计模式,当字典中元素的个数比较少的时候,我们可以直接用dic[key]去给模型对象的属性赋值,但是当字典中元素的个数比较多的时候,再用前面的解决方法就不行了,所以就有了KVC(key value coding:键值编码)字典转模型的设计模式. KVC的设计原理: [item setValue:@"value" forKey:@"property"]: 1.首先去模型中查找有没有setProperty,找到,直接调用赋值 [