(五十一)KVC与KVO详解

KVC的全称为key value coding,它是一种使用字符串间接更改对象属性的方法。

假设有一个Person类和一个Student类,其中Person类有age、name两个属性,Student多一个no(学号)属性。

1.valueForKey: 方法通过传入一个键值返回一个id对象,KVC具有自动包装功能,注意如果是基本类型会返回被包装的对象,需要使用XxxValue方法解包,例如:

NSLog(@"%d",[[s valueForKey:@"age"] intValue]);

虽然age属性为int,但是在这个方法下返回的为NSNumber,应该解包再使用。

2.setValue: forKey: 可以通过key设置Value,对于基本类型应该用NSNumber或者NSValue进行包装(也可以通过@(...)快速包装)。

[s setValue:@18 forKey:@"age"];

[s setValue:[NSNumber numberWithInt:18] forKey:@"age"];

Tip:上面两个方法是非常智能的,会先去寻找getter方法(甚至还会查找isXxx的标准命名方法)或者setter方法,如果找不到就查找_Xxx或者Xxx为名称的成员变量取值或者赋值,总之只要使用规范的命名方法和声明方法,KVC就可以处理。

3.dictionaryWithValuesForKeys:方法,通过传入key数组,返回一个成员变量名(不加下划线)和变量值的键值对组成的字典。

NSDictionary *dict = [s dictionaryWithValuesForKeys:[NSArray arrayWithObjects:@"name",@"age", nil]];

如果使用@来初始化数组,不必写nil(写了会报错,提示nil不是一个OC对象),应该如下书写:

NSDictionary *dict1 = [s dictionaryWithValuesForKeys:@[@"name",@"age"]];

打印出的dict值为:

{
    age = 18;
    name = John;
}

4.setValuesForKeysWithDictionnary: 方法,通过传入字典,初始化相应的键对应的成员变量(同前所述,非常智能的查找)的值为相应的的键值,在MVC设计模式中,模型初始化常用这个方法,一般是写在初始化方法中,通过字典初始化模型数据。

5. dictionaryWithObjects: forKeys: 方法通过传入对象和键名,生成一个 (键-对象) 键值对的字典,注意对非OC对象的包装。

6.key path称为键路径,如果要跨越一层模型数据访问第二层模型数据,例如学生拥有一个学生卡对象,学生卡内部也是个模型,如果要透过card对象访问卡号no属性,就需要通过card.no来调用set或者get方法,这时候可以使用setValue: forKeyPath: 方法,在KeyPath后传入card.no就可以设置no的值了,同样,使用valueForKeyPath:方法可以得到card.no的值。

7.假如有一个Group对象拥有一个Student对象数组,如果要获得所有的Student对象的name,可以使用valueForKeyPath方法返回name数组:

    Student *s = [[Student alloc] init];
    s.age = 15;
    s.name = @"John";
    s.no = @"10010";
    Student *s2 = [[Student alloc] init];
    s2.age = 18;
    s2.name = @"Rose";
    s2.no = @"10011";

    Group *g = [[Group alloc] init];
    g.persons = @[s,s2];

    NSArray *array = [g valueForKeyPath:@"persons.name"];

通过打印可以发现array内存放的为s和s2的name:

(
    John,
    Rose
)

8.键路径运算:

@count运算符表示计算一组值的平均值。这里也可以使用路径运算,例如Group.persons的@count结果 和 Group的"[email protected]" 的结果是一样的,可以把@count理解为具有集合特性的对象的一个成员变量,它表示集合中元素的个数

@sum.xxx 表示计算某个集合内部的xxx属性的和,注意如果是路径访问,使用类似[email protected]访问books内部成员的price来求和。

KVO的全称为key value observing,是一种监听对象属性变化的机制。

通过 addObserver...方法添加监听器,实现observerValueForKeyPath...来监听,通过removeObserver移除监听器。

下面演示一个例子,通过KVO监听ViewController类的name属性的变化,通过NSTimer产生随机的字符串赋给name,打印监听函数的输出,注意有监听就要有移除,要重写dealloc方法,注意ARC不要调super的dealloc方法。

- (void)viewDidLoad {
    [super viewDidLoad];

    [self addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(changestr) userInfo:nil repeats:YES];
    [timer fire];

}

- (void)changestr{
    self.name = [NSString stringWithFormat:@"%d change",arc4random()];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{

    NSLog(@"the keyPath : <%@> ofObject : <%@> is change to <%@>",keyPath,object,change);

}

- (void)dealloc{

    [self removeObserver:self forKeyPath:@"name"];

}

打印出的数据为:

the keyPath : <name> ofObject : <<ViewController: 0x7d18ca00>> is change to <{
    kind = 1;
    new = "1844532638 change";
}>
时间: 2024-10-12 14:55:43

(五十一)KVC与KVO详解的相关文章

一步一步学会puppet(五)--配置文件和常用命令详解

这篇博文主要解析了puppet的配置文件和常用命令,以备以后查阅: =================================================================== 1 配置文件 1.1 组织结构 2 常用命令 2.1 常用命令 2.2 各类命令详解 2.3 帮助类命令 =================================================================== 1 配置文件 1.1 组织结构 配置文件位于/etc/

第十一章、super()详解

目录 第十一章.super()详解 一.引出super()来由 第十一章.super()详解 一.引出super()来由 原始用法: 在python类的方法中,要调用父类的某个方法,通常是类.方法() 使用非绑定的类方法(用类名来引用的方法),并在参数列表引入待绑定的对象self,达到调用父类方法的目的. 缺点: 这样做的缺点是,当一个子类的父类发生变化时(如类B的父类由A变为C时),必须遍历整个类定义,把所有的通过非绑定的方法的类名全部替换过来 如果代码简单,这样的改动或许还可以接受.但如果代

iOS KVO详解

一.KVO 是什么? KVO 是 Objective-C 对观察者设计模式的一种实现.[另外一种是:通知机制(notification),详情参考:iOS 趣谈设计模式--通知]: KVO 提供一种机制,指定一个被观察对象(例如 A 类),当对象某个属性(例如 A 中的字符串 name)发生更改时,对象会获得通知,并作出相应处理:[且不需要给被观察的对象添加任何额外代码,就能使用 KVO 机制] 在 MVC 设计架构下的项目,KVO 机制很适合实现 mode 模型和 view 视图之间的通讯.

ios开发runtime学习五:KVC以及KVO,利用runtime实现字典转模型

一:KVC和KVO的学习 #import "StatusItem.h" /* 1:总结:KVC赋值:1:setValuesForKeysWithDictionary实现原理:遍历字典,得到所有的key,value值,再利用kvc, setVaue forkey来为value赋值 2: [item setValue:@"来自即刻笔记" forKey:@"source"],内部的底层实现, 1.首先去模型中查找有没有setSource,找到,直接调用

第五章 MVC之Bundle详解

一.简述 Bundle,英文原意就是捆.收集.归拢.在MVC中的Bundle技术,也就是一个对css和js文件的捆绑压缩的技术. 它的用处: 将多个请求捆绑为一个请求,减少服务器请求数 压缩javascript,css等资源文件,减小网络带宽,提升性能 使用Bundle技术,并且拥有缓存功能,同时也可以对资源文件进行一定的模块化管理,可使用正则对需要的文件进行过滤匹配,也可以使用cdn文件 二.技术详解 1.怎么开启bundle 在项目的App_Start文件夹中,会有一个BundleConfi

Linux常用命令(二十一) - find之参数详解

一.使用name选项: 文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用.  可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来.  不管当前路径是什么,如果想要在自己的根目录$HOME中查找文件名符合*.log的文件,使用~作为 'pathname'参数,波浪号~代表了你的$HOME目录. find ~ -name "*.log" -print 想要在当前目录及子目录中查找所有的' *.log'文件,可以用: find . -name &

IOS中Key-Value Coding (KVC)的使用详解

kvc,键值编码,是一个非正式的协议,它提供一种机制来间接访问对象的属性.直接访问对象是通过调用访问器的方法实现,而kvc不需要调用访问器的设置和获取方法,可以直接访问对象的属性. 下面介绍一下kvc的用法: 1.对属性赋值 kvc是通过键值对的方式对属性设置值,提供了下面的方法,相当于访问器中的set方法.value为要设置的值,key是字符串,字符串中内容为为属性的名称 - (void)setValue:(id)value forKey:(NSString *)key; - (void)se

iOS------通知、代理、kvo 详解

通知:通知中心实际上是在程序内部提供了消息广播的一种机制.通知中心不能在进程间进行通信.实际上就是一个二传手,把接收到的消息,根据内部的一个消息转发表,来将消息转发给需要的对象.通知中心是基于观察者模式的,它允许注册.删除观察者. 一个 NSNotificationCenter 可以有许多的通知消息 NSNotification, 对于每一个 NSNotification 可以有很多的观察者 Observer 来接收通知. 委托代理:委托代理(degegate),顾名思义,把某个对象要做的事情委

KVO详解

  1,注册与解除注册 如果我们已经有了包含可供键值观察属性的类,那么就可以通过在该类的对象(被观察对象)上调用名 为 NSKeyValueObserverRegistration 的 category 方法将观察者对象与被观察者对象注册与解除 注册: - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath opt ions:(NSKeyValueObservingOptions)options contex