使用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
下面有两个示例类:
- Person类:name,age,dog及dogs四个属性;
- 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);
}
总结
- key的值必须正确,如果拼写错误,会出现异常;
- valueForKey\ valueForKeyPath 方法根据key的值读取对象的属性,setValue:forKey:\ forKeyPath: 是根据key的值来写对象的属性;
- 推荐使用 valueForKeyPath \ setValue:forKeyPth;
- 当key的值是没有定义的,valueForUndefinedKey:这个方法会被调用,如果重写了这个方法,就可以获取错误的key值。
使用KVC的更多相关文章
- Objective-C之KVC、KVO
1,KVC(键值编码) Key Value Coding 1.1在C#中,可以通过字符串反射来获取对象,从而对对象的属性进行读写,Object-C中有同样的实现,通过字符串(属性名词)对对象的属性进 ...
- KVC 和 KVO
KVC 键值编码 全称是Key-value coding,翻译成键值编码.它提供了一种使用字符串而不是访问器方法去访问一个对象实例变量的机制. 1.通过key(成员变量的名称)设置 ...
- 11. KVC And KVO
1. KVC And KVO 的认识 KVC/KVO是观察者模式的一种实现 KVC全称是Key-value coding,翻译成键值编码.顾名思义,在某种程度上跟map的关系匪浅.它提供了一种使用 ...
- iOS开发系列--Objective-C之KVC、KVO
概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听( ...
- IOS学习之初识KVC
什么是kvc? kvc (key-value coding )键值编码,是ios 提供的一种通过key间接的来访问对象属性的一直方式. 哪些类支持kvc操作? kvc的操作方法由NSKeyValueC ...
- KVC & KVO
KVC和KVO看上去又是两个挺牛的单词简写,KVC是Key-Value Coding的简写,是键值编码的意思.KVO是Key-Value Observing的简写,是键值观察的意思.那么我们能拿KV ...
- iOS - 详细理解KVC与KVO
详细理解KVC与KVO 在面试的时候,KVC与KVO有些时候还是会问到的,并且他们都是Objective C的关键概念,在这里我们先做一个简单地介绍: (一)KVC: KVC即指:NSKeyValue ...
- KVC&&&KVO
KVC 什么是KVC --->What KVC指的就是NSKeyValueCoding非正式协议. KVC是一种间接地访问对象的属性的机制. 这种间接表现在通过字符串来标识属性,而不是通过调用存 ...
- OC KVC
OC KVC KVC 全称 key valued coding 键值编码 在说KVC之前应该简单的了解一下反射机制 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法. 对于任意 ...
- IOS开发之Bug--使用KVC的易错情况
1.其实某些角度而言KVC是一个破坏封装又暴力的做法,而我已经两次因为KVC而导致应用程序出现闪退的情况. 场景:1.使用KVC修改某一个UIView的属性,比如width. 2.在viewWi ...
随机推荐
- 基于ArcGIS的栅格图像平滑处理(转)
基于ArcGIS的栅格图像平滑处理 栅格数据获取的途径多种多样,造成了栅格数据质量的很大差异,一些质量较差的栅格数据存在大量“噪音”象元,即在表达同类型的地理要素时,出现个别像元值与周边像元不一致的情 ...
- git - 版本控制器(本地仓库)
本地创建仓库,然后进行管理.提交到本地仓库(不需要网络),提交到远程仓库(需要网络) 相对于svn为克隆方式,赋值的是整个仓库,svn只是复制的代码. 1.电脑新创建一个”本地仓库”空文件夹 2. ...
- android之模拟器访问外网设置
一.确定adb可用 1.1 确认adb环境变量 1.2 命令行cmd 执行adb shell启动模拟器的命令行 二.DNS确认 2.1 确定DNS是否为电脑的DNS 2.2 修改DNS地址 三.效果图
- 什么是CS和BS结构,两种结构的区别
什么是CS和BS结构,两种结构的区别 什么是C/S和B/S结构? C/S又称Client/Server或客户/服务器模式.服务器通常采用高性能的PC.工作站或小型机,并采用大型数据库系 ...
- jquery自动生成二维码
把下面的jquery代码放到想要在当前页面上面生成二维码: 代码如下: <script type="text/javascript">var _qrContent='' ...
- asp实现关键词不区分大小写搜索并高亮显示
用ASP做搜索很容易,但要实现智能搜索这类就比较累一点,其实任何程序都差不多,主要还是看数据库的处理能力,一般小网站ASP经常跟ACCESS数据库搭配,在这种配置下我们要实现关键词不区分大小写搜索并高 ...
- 收回动态VHD的未使用空间
随着虚拟机的运行,虚拟机磁盘所占空间越来越大,而实际使用并没有那么大,考虑回收未使用部分. 收回动态VHD的未使用空间(压缩VHD) 有一种方法是ghost,两个vhd文件对拷.本文不是那个方法 本文 ...
- 在.net中设置debug模式预设代码
#region DEBUG #if DEBUG this.WorkOrgID.Value = "4DC4507E-434D-4EEB-967E-1E5CC28AA0C1"; thi ...
- 【JAVA】在编译期可直接替换的final变量
一.满足以下三个条件,一个final变量就不再是一个变量,而是一个直接量. 使用final修饰符修饰. 在申明的时候就进行初始化 初始化的值在编译器就可以确定. 二.在什么情况下初始化的值在编译期是可 ...
- js 金额格式化
//格式化金额 function fmoney(s, n) { n = n > 0 && n <= 20 ? n : 2; s = parseFloat((s + &quo ...