使用KVC

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:@"[email protected]"];
      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

时间: 2024-10-23 20:12:11

使用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,找到,直接调用赋值 [