在iOS开发中,我们一般使用set方法或者点语法来修改对象的属性值,比如说 stu.age = 9 与 [stu setAge:9]。

  KVC(key value coding)键值编码,这是一种间接修改对象属性值的方法。实现方法就是通过用字符串来描述要修改的属性。基本的操作方法有 setValue:forKey: 和 valueForKey,以字符串的形式发送对象

  特别提醒,使用KVC中所有的value都必须是对象。

在此以Student类和 Book类作为例子来总结

  Student类:

 //.h文件
#import <Foundation/Foundation.h>
@class Book;
@interface Student : NSObject @property (nonatomic, assign) int age; @property (nonatomic, copy) NSString* name; @property (nonatomic, strong) Book* book; @property (nonatomic, strong) NSArray* books;
@end //.m文件 #import "Student.h"
#import "Book.h"
@implementation Student - (NSString *) description
{
return [NSString stringWithFormat:@"%@ %d", _name, _age];
}
@end

  Book类:

  

 //.h文件
#import <Foundation/Foundation.h> @interface Book : NSObject @property (nonatomic, assign) int price;
@end //.m文件
#import "Book.h" @implementation Book @end

  主函数:

  

 #import <Foundation/Foundation.h>
#import "Student.h"
#import "Book.h" //1.设值 取值
void fun1()
{
NSLog(@"==============fun1==============");
Student *stu = [[Student alloc] init]; [stu setValue:@"hehe" forKey:@"name"];
[stu setValue:@ forKey:@"age"]; NSLog(@"%@", stu); NSLog(@"name : %@", [stu valueForKey:@"name"]);
} //2.批量获取属性值
void fun2()
{
NSLog(@"==============fun2==============");
Student *stu = [[Student alloc] init]; [stu setValue:@"hehe" forKey:@"name"];
[stu setValue:@ forKey:@"age"]; NSArray *arr = @[@"name", @"age"]; NSDictionary *dict = [stu dictionaryWithValuesForKeys:arr]; NSLog(@"%@", dict);
} //3.批量设置属性值(通过字典批量赋值)
void fun3()
{
NSLog(@"==============fun3==============");
Student *stu = [[Student alloc] init]; NSDictionary *dict = @{@"age": @, @"name" : @"悟空"}; [stu setValuesForKeysWithDictionary:dict]; NSLog(@"%@", stu);
} //4.通过键路径(key path)访问(使用valueForKeyPath)
void fun4()
{
NSLog(@"==============fun4==============");
Student *stu = [[Student alloc] init];
Book *book = [[Book alloc] init];
stu.book = book;
//设置值
[stu setValue:@ forKeyPath:@"book.price"];
//获取值
NSNumber *price = [stu valueForKeyPath:@"book.price"]; NSLog(@"price: %@", price);
} //5.对数组进行整体操作
void fun5()
{
NSLog(@"==============fun5==============");
Student *stu = [[Student alloc] init]; Book *book = [[Book alloc] init];
book.price = ;
Book *book1 = [[Book alloc] init];
book1.price = ;
Book *book2 = [[Book alloc] init];
book2.price = ; NSArray *arr = @[book, book1, book2]; stu.books = arr;
//获取值
// NSArray *prices = [stu valueForKeyPath:@"books.price"];
NSArray *prices = [stu.books valueForKeyPath:@"price"];
NSLog(@"prices: %@", prices);
} //6.键路径的运算符(数组元素求和)
void fun6()
{
NSLog(@"==============fun6==============");
Student *stu = [[Student alloc] init]; Book *book = [[Book alloc] init];
book.price = ;
Book *book1 = [[Book alloc] init];
book1.price = ;
Book *book2 = [[Book alloc] init];
book2.price = ; NSArray *arr = @[book, book1, book2]; stu.books = arr;
//获取值
NSNumber *sum = [stu valueForKeyPath:@"books.@sum.price"];
NSLog(@"prices: %@", sum);
} //7.键路径的运算符(数组总数count)
void fun7()
{
NSLog(@"==============fun7==============");
Student *stu = [[Student alloc] init]; Book *book = [[Book alloc] init];
book.price = ;
Book *book1 = [[Book alloc] init];
book1.price = ;
Book *book2 = [[Book alloc] init];
book2.price = ; NSArray *arr = @[book, book1, book2]; stu.books = arr;
//获取值
NSNumber *sum = [stu valueForKeyPath:@"books.@count.price"];
NSLog(@"num: %@", sum);
} //8.键路径的运算符(获取数组不同元素)
void fun8()
{
NSLog(@"==============fun8==============");
Student *stu = [[Student alloc] init]; Book *book = [[Book alloc] init];
book.price = ;
Book *book1 = [[Book alloc] init];
book1.price = ;
Book *book2 = [[Book alloc] init];
book2.price = ; NSArray *arr = @[book, book1, book2]; stu.books = arr;
//获取值
NSArray *array = [stu valueForKeyPath:@"books.@distinctUnionOfObjects.price"];
NSLog(@"array: %@", array);
} //9.求数组元素中得最大值、最小值、平均值
void fun9()
{
NSLog(@"==============fun9==============");
Student *stu = [[Student alloc] init]; Book *book = [[Book alloc] init];
book.price = ;
Book *book1 = [[Book alloc] init];
book1.price = ;
Book *book2 = [[Book alloc] init];
book2.price = ; NSArray *arr = @[book, book1, book2]; stu.books = arr;
//获取值
NSNumber *max = [stu valueForKeyPath:@"books.@max.price"];
NSNumber *min = [stu valueForKeyPath:@"books.@min.price"];
NSNumber *average = [stu valueForKeyPath:@"books.@avg.price"];
NSLog(@"max: %@", max);
NSLog(@"min: %@", min);
NSLog(@"avg: %@", average);
} int main(int argc, const char * argv[])
{ @autoreleasepool {
fun1();
fun2();
fun3();
fun4();
fun5();
fun6();
fun7();
fun8();
fun9();
}
return ;
}

  

OC KVC总结的更多相关文章

  1. OC KVC

    OC KVC KVC 全称 key valued coding 键值编码 在说KVC之前应该简单的了解一下反射机制 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法. 对于任意 ...

  2. oc kvc的模式:匹配搜索模式(模式匹配)、装包解包

    按照一定规则使用匹配模式在目标空间进行搜索,然后执行相应操作: 运行时系统将kvc的运行机制解释为模式匹配,将值的兼容性问题解释为装包解包问题 一.模式匹配 The default implement ...

  3. iOS 头条一面 面试题

    1.如何高效的切圆角? 切圆角共有以下三种方案: cornerRadius + masksToBounds:适用于单个视图或视图不在列表上且量级较小的情况,会导致离屏渲染. CAShapeLayer+ ...

  4. OC:属性、点语法、KVC

    //属性的属性 属性定义在一个 .h文件里,在这个.h文件里可以定义实例变量(就是这个类的特征),也可以通过   @protery(属性约束关键字) 属性名字类型 属性名 来定义一些属性,在prope ...

  5. KVC 和 OC字典

    KVC(键值编码)和OC 字典很相似,都是键值存储.但是OC 字典比较灵活,它是一种映射. [dict setObject:<#(id)#> forKey:<#(id<NSCo ...

  6. QF——OC中的KVC,KVO

    KVC: (Key Value Coding) 键值编码 所谓KVC,其实就是不通过set和get方法访问对象属性,而是通过属性名字符串动态的去读取属性.KVC其实也是OC反射机制的一种运用. 之所以 ...

  7. 设计模式之观察者模式(关于OC中的KVO\KVC\NSNotification)

    学习了这么久的设计模式方面的知识,最大的感触就是,设计模式不能脱离语言特性.近段时间所看的两本书籍,<大话设计模式>里面的代码是C#写的,有一些设计模式实现起来也是采用了C#的语言特性(C ...

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

    前一篇文章我们介绍了OC中最常用的文件操作:http://blog.csdn.net/jiangwei0910410003/article/details/41875015,那么今天来看一下OC中的一 ...

  9. [转] iOS (OC) 中 KVC 与 KVO 理解

    转自: http://magicalboy.com/kvc_and_kvo/ KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value ...

随机推荐

  1. Javascript面向对象之创建对象

    面向对象的语言具有一个共同的标志,那就是具有“类”的概念,但是在javascript中没有类的概念,在js中将对象定义为“无序属性的集合,其属性可以包含基本值,对象或者函数”,即其将对象看作是一组名值 ...

  2. visual leak dector内存泄漏检测方法

    http://vld.codeplex.com/ QT 内存泄露时,你们一般用什么工具检测啊 ------解决方案--------------------这篇你觉得详细么 :http://newfac ...

  3. Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn

    这个异常我在网上查看了很多资料,一般都说是hibernate的session问题,让重新两个方法,但是我以前用的时候没问题啊,所以一直找问题,终于这个bug让我找到了,就是因为我插入操作的时候用的是别 ...

  4. Android开发(27)--TextView单击链接弹出Activity

    话不多说直接上码: 核心源码: package com.example.textview4; import android.app.Activity; import android.content.I ...

  5. android开发利器--站在巨人肩膀上前行

    本文主要介绍有助于android开发的三方平台和站点. 一:开发阶段 1:SVN(一个开放源码的版本号控制系统) 团队开发没有server,代码管理就没那么方便了,推荐taocode阿里开源站点,方便 ...

  6. SPOJ QTREE4 lct

    题目链接 这个题已经处于花式tle了,改版后的spoj更慢了.. tle的话就多交几把... #include <iostream> #include <fstream> #i ...

  7. Android建立模拟器进行调试

    安装好android开发环境后.用到下面几个命令.android, adb, emulator android - 最主要的android命令.能够进行sdk更新,列出设备源,生成虚拟设备等. adb ...

  8. 潜在语义分析Latent semantic analysis note(LSA)原理及代码

    文章引用:http://blog.sina.com.cn/s/blog_62a9902f0101cjl3.html Latent Semantic Analysis (LSA)也被称为Latent S ...

  9. eclipse开发工具Import工程后,工程文件夹上出现黄色感叹号——解决方法

    eclipse开发工具Import工程后,工程文件夹上出现黄色感叹号. 可能是Work目录无效,解决方法:删除Work目录即可,如下图所示: 删除后,如下图:

  10. 对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。

    在程序中调用C++链接库中的回调函由于没有考虑生命周期,直接写委托回随机的被gc给回收掉导致报这个错误 错误的程序: private void InitPlateIdentify() { try { ...