IOS开发之KVC与KVO简述
KVC:Key-Value Coding
KVO:Key-Value Observing
Person.m
#import <Foundation/Foundation.h>
@interface Person : NSObject{
//该访问修饰符用于说明即使私有成员变量也可以通过kvc方式访问和赋值
@private
NSString *_name;
NSArray *_dogs;
}
@end
@implementation Person
@end
Dog.m
#import <Foundation/Foundation.h> @class Person; @interface Dog : NSObject
{
@private
NSInteger _age;
Person *_owner;
}
@end @implementation Dog
@end
PersonObserve.m
#import <Foundation/Foundation.h>
#import "Person.h" @interface PersonObserve : NSObject
@end @implementation PersonObserve
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
Person *p = (Person *)object;
//使用kvc方式获取成员变量keypath的值
NSLog(@"%@",[p valueForKey:keyPath]);
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "PersonObserve.h"
#import "Dog.h" int main(int argc, const char * argv[]) {
//观察者类
PersonObserve *po = [[PersonObserve alloc] init];
Person *p = [[Person alloc] init];
//使用kvo方式对成员变量“name”的属性值变化增加观察者po
//po将在该属性值发生变化时执行- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context方法
[p addObserver:po forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil]; //通过kvc方式设置成员变量“name”的属性值
//触发观察者执行对应方法
[p setValue:@"zhangsan" forKey:@"name"]; //kvc中forKeyPath的用法
Dog *d = [[Dog alloc] init];
[d setValue:p forKey:@"owner"];
[d setValue:@"lisi" forKeyPath:@"owner.name"]; //移除对私有成员变量“name”的观察
[p removeObserver:po forKeyPath:@"name"]; Dog *d1 = [[Dog alloc] init];
[d1 setValue:@ forKey:@"age"];
Dog *d2 = [[Dog alloc] init];
[d2 setValue:@ forKey:@"age"]; NSArray *array = [NSArray arrayWithObjects:d1,d2, nil];
[p setValue:array forKey:@"dogs"]; //kvc中valueForKeyPath数组内置表达式的用法
NSLog(@"dogs.age = %@",[p valueForKeyPath:@"dogs.age"]);
NSLog(@"dogs.age.sum = %@",[p valueForKeyPath:@"dogs.@sum.age"]);//dogs数组中age的总和
NSLog(@"dogs.age.avg = %@",[p valueForKeyPath:@"dogs.@avg.age"]);//dogs数组中age的平均值
NSLog(@"dogs.age.max = %@",[p valueForKeyPath:@"dogs.@max.age"]);//dogs数组中age的最大值
NSLog(@"dogs.age.min = %@",[p valueForKeyPath:@"dogs.@min.age"]);//dogs数组中age的最小值 return ;
}
结果:
-- ::34.611 KVC&KOC[:] zhangsan
-- ::34.612 KVC&KOC[:] lisi
-- ::34.613 KVC&KOC[:] dogs.age = (
, )
-- ::34.613 KVC&KOC[:] dogs.age.sum =
-- ::34.613 KVC&KOC[:] dogs.age.avg =
-- ::34.613 KVC&KOC[:] dogs.age.max =
-- ::34.613 KVC&KOC[:] dogs.age.min =
Program ended with exit code:
IOS开发之KVC与KVO简述的更多相关文章
- IOS开发之KVC KVO KVB
KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的 ...
- iOS开发之KVC全解
一 KVC的基本概念 1.KVC是Key Value Coding的缩写,意思是键值编码. 在iOS中,提供了一种方法通过使用属性的名称(也就是Key)来间接访问对象属性的方法,这个方法可以不通过g ...
- iOS开发之KVC
1.KVC概述 KVC(Key-value coding)是一套利用字符串标识符间接访问对象属性和关系的机制.Cocoa Programming中,Core Data,Application Scri ...
- iOS 开发之 KVC - setValuesForKeysWithDictionary 解析
从字典映射到一个对象,这是KVC中的一个方法所提供的,这个方法就是 setValuesForKeysWithDictionary:,非常好用,不需要你来一一的给对象赋值而直接从字典初始化即可,但用的不 ...
- iOS中关于KVC与KVO知识点
iOS中关于KVC与KVO知识点 iOS中关于KVC与KVO知识点 一.简介 KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCodin ...
- 李洪强iOS开发之iOS社区收集
李洪强iOS开发之iOS社区收集 项目 简述 github 全球最大的代码仓库,无论是iOS开发还是Android开发没有人不知道这个网站,它也是一个社区,你可以去follow(关注)某些人或公司. ...
- 李洪强iOS开发之iOS工具收集
李洪强iOS开发之iOS工具收集 项目 简述 日期 我是怎么慢慢变懒的 : Jenkins + 蒲公英 使用Jenkins + 蒲公英使得项目打包给测试人员自动化,大大节省了劳动力 2015.04.1 ...
- 李洪强iOS开发之iOS学习方法收集
李洪强iOS开发之iOS学习方法收集 在这里收集一些iOS学习方法,会不断更新 项目 简述 日期 一年多iOS开发总结 作者总结了自己一年多的iOS学习经验,对于iOS初学者来说很多地方是可以借鉴的 ...
- 李洪强iOS开发之iOS好文章收集
李洪强iOS开发之iOS好文章收集 该文收集朋友们转发或自己的写的技术文章,如果你也有相关的好文章,欢迎留言,当好文章多的时候,我会对这些好文章进行分门别类 文章 简述 日期 直播服务配置 使用 ng ...
随机推荐
- Android 天气应用开发
百度 API Store中很多免费的天气API,因此写一个天气应用相对变得很容易. 首先尝试API给的接口,接受返回数据. public class MainActivity extends Acti ...
- HW4.35
public class Solution { public static void main(String[] args) { double sum = 0; for(int i = 1; i &l ...
- cygwin设置中文
cygwin\home\username\.bashrc # 让ls和dir命令显示中文和颜色 alias ls='ls --show-control-chars --color' alias dir ...
- java动态编程库,利用动态编程打印运行时调用全景(函数调用关系链)
如果是一般java程序,不追求性能极致,想使用方便,推荐使用 Javassist 库. 如果是android程序,或者一般java程序欲追求性能极限,推荐使用 asm for java 及 asmde ...
- Linux中find、grep命令详细用法
在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍find.grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们.本文结构如下: find命令 find命令的一般形式 ...
- 问题-[WIN8.132位系统]安装Win8.1 遇到无法升级.NET Framework 3.5.1
问题现象:安装Win8后都遇到了无法升级.NET Framework 3.5.1的问题,在线升级会遇到错误0x800F0906.这使得91手机助手等很多软件无法运行,更郁闷的是,网上几乎所有的解决办法 ...
- zoj 2588 Burning Bridges【双连通分量求桥输出桥的编号】
Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little cou ...
- hdoj 2546 饭卡
饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- 库不存在的排查方法:ImportError: No module named selenium2Library
解决办法: 把selenium2Library改成Selenium2Library 安装下面四个: python-2.7.13.amd64.msi robotframework-ride-1.5. ...
- EF搜索数据自动将表名变复数问题
原因这个是自己生成的需要在model加Table 其他博主写了aweier2011