KVC是Key Value Coding的简称,意思是键值编码,号称Cocoa的大招。它是一种可以直接通过字符串key(对象在名称)来访问或修改对象属性的机制。


使用

1.利用KVC可以随意修改一个对象的属性或者成员变量(私有的也可以修改)。

其中,key为被修改对象的名称或者其成员变量名称。

#import <UIKit/UIKit.h>

@interface MainTabBarController : UITabBarController

@end
@implementation MainTabBarController

- (void)viewDidLoad {
[super viewDidLoad]; // ZTTabBar是自定义的tabBar,这里要修改系统空间为自定义tabBar
ZTTabBar *tabBar = [[ZTTabBar alloc] init];
// self.tabBar = tabBar; 这里会报错,原因tabBar为readonly,所以这里考虑使用KVC。
[self setValue:tabBar forKeyPath:@"tabBar"];
} @end

2.KVC: forKey、forKeyPath的区别,建议使用forKeyPath

下面有两个示例类:

  1. Person类:name,age,dog及dogs四个属性;
  2. Dog类:name,number两个属性。
    (这个人很喜欢养狗)

类:Person
.h

#import <Foundation/Foundation.h>

@class Dog;

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age; @property (nonatomic, strong) Dog *dog;
@property (nonatomic, strong) NSArray *dogs; - (void)printHeight;
@end

.m

#import "Person.h"

@implementation Person
{
@private
double _height; // 身高
} @end

类Dog
.h

#import <Foundation/Foundation.h>

@interface Dog : NSObject

@property (nonatomic, copy) NSString *name; //名字
@property (nonatomic, assign) Int *number; //数量 @end

.m

#import "Dog.h"

@implementation Dog

@end

使用KVC修改属性:

- (void)testKVC
{
Person *p = [[Person alloc] init];
// 1.property
p.name = @"rose";
p.age = 20;
p.dog = [[Dog alloc] init];
p.dog.name = "旺财"; // 2.forkey
[p setValue:@"jack" forKey:@"name"];
[p setValue:@30 forKey:@"age"];
[p.dog setValue:@"旺福" forKey:@"name"]; //Person对象的私有变量_height,对两个key:height\_height,任意一个key都可以修改其属性。
//(对于height,KVC先从内存中寻找对应名为height的属性,如果找不到就会自动寻找_height,然后进行相应的修改)
[p setValue:@1.80 forKey:@"height"];
[p setValue:@1.85 forKey:@"_height"]; // 3.forKeyPath
// forKeyPath包含了forKey的功能,以后使用forKeyPath就可以了。
// forKeyPath可以利用‘ . ’运算符一层一层往下查找对象的属性
[p setValue:@"jack" forKeyPath:@"p.name"];
[p setValue:@30 forKeyPath:@"p.age"]; [p setValue:@"哈士奇" forKeyPath:@"dog.name"]; NSLog(@"%d %@", p.age, p.name);
}

3. KVC取值

- (void)useKVCGetValue
{
Person *p = [[Person alloc] init];
p.dog = [[Dog alloc] init];
[p setValue:@"妞妞" forKeyPath:@"dog.name"]; NSLog(@"%@", [p valueForKeyPath:@"dog.name"]);
}

4.KVC Tips

- (void)test
{
Person *p = [[Person alloc] init]; Dog *dog1 = [[Dog alloc] init];
dog1.name = @"中华田园犬"; // 看家还得看土狗
dog1.number = 3; Dog *dog2 = [[Dog alloc] init];
dog2.name = @"哈士奇"; // 二货,这玩意不能多养
dog2.number = 1; Dog *dog3 = [[Dog alloc] init];
dog3.name = @"柴犬";
dog3.number = 4; Dog *dog4 = [[Dog alloc] init];
dog3.name = @"萨摩耶";
dog3.number = 3; Dog *dog5 = [[Dog alloc] init];
dog5.name = @"黑背";
dog5.number = 3; p.dogs = @[dog1, dog2, dog3, dog4, dog5];
1. tip1:取指定数组
// 取出dogs数组中每一个元素的name属性值,放到一个新的数组中返回
NSArray *dogNames = [p valueForKeyPath:@"dogs.name"]; 2.tip2: @sum(求和),@avg(求平均数),更多tip请百度。
// 计算所有狗的个数
NSNumber *dogsNumber = [p valueForKeyPath:@"dogs.@sum.number"];
NSLog(@"%@", sumNumber);
}

总结

  1. key的值必须正确,如果拼写错误,会出现异常;
  2. valueForKey\ valueForKeyPath 方法根据key的值读取对象的属性,setValue:forKey:\ forKeyPath: 是根据key的值来写对象的属性;
  3. 推荐使用 valueForKeyPath \ setValue:forKeyPth;
  4. 当key的值是没有定义的,valueForUndefinedKey:这个方法会被调用,如果重写了这个方法,就可以获取错误的key值。
原文链接:http://www.jianshu.com/p/0e358f18950e

使用KVC的更多相关文章

  1. Objective-C之KVC、KVO

    1,KVC(键值编码)  Key Value Coding 1.1在C#中,可以通过字符串反射来获取对象,从而对对象的属性进行读写,Object-C中有同样的实现,通过字符串(属性名词)对对象的属性进 ...

  2. KVC 和 KVO

    KVC 键值编码    全称是Key-value coding,翻译成键值编码.它提供了一种使用字符串而不是访问器方法去访问一个对象实例变量的机制.        1.通过key(成员变量的名称)设置 ...

  3. 11. KVC And KVO

    1. KVC And KVO  的认识 KVC/KVO是观察者模式的一种实现  KVC全称是Key-value coding,翻译成键值编码.顾名思义,在某种程度上跟map的关系匪浅.它提供了一种使用 ...

  4. iOS开发系列--Objective-C之KVC、KVO

    概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听( ...

  5. IOS学习之初识KVC

    什么是kvc? kvc (key-value coding )键值编码,是ios 提供的一种通过key间接的来访问对象属性的一直方式. 哪些类支持kvc操作? kvc的操作方法由NSKeyValueC ...

  6. KVC & KVO

    KVC和KVO看上去又是两个挺牛的单词简写,KVC是Key-Value Coding的简写,是键值编码的意思.KVO是Key-Value  Observing的简写,是键值观察的意思.那么我们能拿KV ...

  7. iOS - 详细理解KVC与KVO

    详细理解KVC与KVO 在面试的时候,KVC与KVO有些时候还是会问到的,并且他们都是Objective C的关键概念,在这里我们先做一个简单地介绍: (一)KVC: KVC即指:NSKeyValue ...

  8. KVC&&&KVO

    KVC 什么是KVC --->What KVC指的就是NSKeyValueCoding非正式协议. KVC是一种间接地访问对象的属性的机制. 这种间接表现在通过字符串来标识属性,而不是通过调用存 ...

  9. OC KVC

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

  10. IOS开发之Bug--使用KVC的易错情况

    1.其实某些角度而言KVC是一个破坏封装又暴力的做法,而我已经两次因为KVC而导致应用程序出现闪退的情况. 场景:1.使用KVC修改某一个UIView的属性,比如width.    2.在viewWi ...

随机推荐

  1. 手机页面rem布局

    手机页面设计一般的大小是640,但是,手机屏幕大小确实不确定的,这样,怎么才能做出适应所有手机的手机页面呢?一般的解决方案有两种,rem布局和百分比布局,更推荐用rem布局来制作手机页面. 首先,给页 ...

  2. typedef的使用1——引入

    #include <stdio.h> #include <string.h> //#define _CRT_SRCURE_NO_WARNING #pragma warning( ...

  3. [Oracle EBS R12]SQL Queries and Multi-Org Architecture in Release 12 (Doc ID 462383.1)

    In this Document   Abstract   History   Details   Previous Releases   Release 12   Multi-Org Session ...

  4. PHPBB 学习

    Fixing incorrect cookie settings  设置PHPBB的cookie

  5. activity和fragment的声明周期

    Activity生命周期: Fragment生命周期:

  6. 多个DIV让float:left属性,最后一个DIV填满剩余的部分

    <DIV style="border:1px solid red; overflow:hidden;zoom:1;">      <DIV style='floa ...

  7. R cannot be resolved to a variable 解决办法

    Android开发过程中,碰到R cannot be resolved to a variable的报错信息,好像没有很确定的错误原因,一般来说,我总结出几个可能的解决方法,希望试过以后管用... 1 ...

  8. Oracle学习第一天---安装和基础入门

    国庆七天假,决定静下心来入门Oracle数据库. 环境:Ocacle 11g 软件安装包和安装图解,大家可以在我的百度网盘上下载:链接:http://pan.baidu.com/s/1ntjDEnZ ...

  9. GDI+中发生一般性错误之文件被占用

    有多种原因可能导致这个异常出现,比如创建文件的权限不足.文件被占用等. 这里提供一个使用Stream读取图片避免文件被占用的方法. public Image GetImageFromStream(st ...

  10. String练习

    /*1,模拟一个trim方法,去除字符串两端的空格.    思路:    1,判断字符串第一个位置是否是空格,如果是继续向下判断,直到不是空格为止.        结尾处判断空格也是如此.    2, ...