使用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 ...
随机推荐
- python生成简单的验证码
#coding=utf-8 from PIL import Image, ImageDraw, ImageFont, ImageFilter import random # 随机字母: def rnd ...
- Android_listView_BaseAdapter_downLoadImg
layout.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" x ...
- [未完成]关于枚举(Enum)
今天总结一下枚举相关的知识.先附一段关于枚举的代码: package org.talend.core.model.param; import org.talend.core.i18n.Messages ...
- c# 远程监控(1) 大纲
此篇文章主要讲了如何使用C# Winform程序模拟一个远程监控系统,并使用RTP实时传输协议传输数据. 应用场景:远程监控.局域网视频会议.客户端流式缓冲播放 这方面的资料还是有一些,但是都需要整合 ...
- js观察者模式
观察者模式存在观察者和被观察者 被观察者的状态发生改变,通知观察者调用观察者的update方法,观察者的update方法对被观察者的状态进行检测,做出相应的操作 被观察者存在接口attach,deta ...
- 使用 ICharpCode.SharpZipLib 压缩指定目录结构
今天做项目中遇见一个压缩问题,我的目录结构是树形菜单,文件在服务器存储是平面存储,没有目录结构,所以在下载指定目录的时候要构建目录结构,如下: 当我右键点击下载b目录文件夹的时候要Download ...
- Azure Redis Cache作为ASP.NET Session状态提供程序
从上一篇博客<使用Azure Redis Cache>我们已经可以创建并使用Redis Cache为我们服务了. 作为Web开发者,我们都知道Session状态默认是保存在内存中的,它的优 ...
- C++实现元组
一般我们使用struct时需要在头文件中定义,例如 struct Example { int a; char b; ... }; 这样将数据打包好必须在程序运行之前将其定义好,如果有需求在程序运行时添 ...
- powerdesign设置实体显示格式
工具-显示参数选择中,如下图:
- JavaScript高级程序设计(九):基本概念----函数
一.参数的理解 1.ECMAScript中的参数在内部是用一个数组来表示的.函数接收到的始终是这个数组,而不关心数组中包含多少个参数,即使没有参数也可以. 2.实质上,函数可以通过arguments对 ...