私有变量访问及赋值

首先来看看KVC的其余用处及简介

1、 KVC介绍

kvc就是键值编码(key-value),说白了就是经过指定的key得到想要的值value。而不是经过调用Setter、Getter方法访问。*web

2、 KVC的强大之处

1 .访问私有变量

一个类中的私有变量,不能直接经过Setter、Getter方法访问。可是却能够经过KVC来访问。举例:json

一个类以下:编码

@interface Dog : NSObject
{
    @private
    double height;
}

这里的私有变量 height ,假如直接使用Setter、Getter方法访问,就会出现下面的错误。spa

这时候能够使用KVC来访问这个私有变量:code

Dog *dog = [[Dog alloc]init];
[dog setValue:@12 forKey:@"height"];//给私有变量赋值 NSLog(@"dog's height is = %@",[dog valueForKey:@"height"]);//读取私有变量的值
  • 实际使用举例orm

    利用kvc的这个特性,咱们能够访问系统里的一些私有变量。blog

    例如:在UIPageControl里面有两个私有变量:ci

UIImage*        _currentPageImage;
UIImage*        _pageImage;

咱们能够经过kvc来进行读取和赋值:it

UIPageControl *pageControl = [[UIPageControl alloc]init];
//设置值
[pageControl setValue:[UIImage imageNamed:@"XX"] forKeyPath:@"_currentPageImage"];

[pageControl setValue:[UIImage imageNamed:@"XX"] forKeyPath:@"_pageImage"];
//读取值
UIImage *currentImage = [pageControl valueForKey:@"_currentPageImage"]; UIImage *pageImage = [pageControl valueForKey:@"_pageImage"];

这样咱们就能够设置当前显示和未显示到脚标的样式了。io

2. 使用KVC直接访问 NSArray 或者 NSSet 的属性值

NSArray/NSSet等都支持KVC,这里举一个例子:

NSArray *books= @[book1, book2, book3];
NSArray *names = [books valueForKeyPath:@"name"]; NSLog(@"%@", [books valueForKeyPath:@"@avg.price"]);//使用kvc直接打印出来书的平均价格

其中,book是一个书类,有一个属性是name,一个属性是price。

3. 使用KVC将字典(json)转化成模型

// 定义一个字典
 NSDictionary *dict = @{
         @"name"  : @"jack",
         @"money" : @"20.7",
      };
 // 建立模型
 Person *p = [[Person alloc] init];
 // 字典转模型
 [p setValuesForKeysWithDictionary:dict];
 NSLog(@"person's name is the %@",p.name);
}

注意:

(1). key的值必须正确,若是拼写错误,会出现异常

(2). 当key的值是没有定义的,valueForUndefinedKey:这个方法会被调用,若是你本身写了这个方法,key的值出错就会调用到这里来

(3). 由于类key反复嵌套,因此有个keyPath的概念,keyPath就是用.号来把一个一个key连接起来,这样就能够根据这个路径访问下去

(4). NSArray/NSSet等都支持KVC

相关文章
相关标签/搜索