博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS开发之KVC与KVO简述
阅读量:6735 次
发布时间:2019-06-25

本文共 2784 字,大约阅读时间需要 9 分钟。

KVC:Key-Value Coding

KVO:Key-Value Observing

 

Person.m

#import 
@interface Person : NSObject{ //该访问修饰符用于说明即使私有成员变量也可以通过kvc方式访问和赋值 @private NSString *_name; NSArray *_dogs;}@end@implementation Person@end

Dog.m

#import 
@class Person;@interface Dog : NSObject{ @private NSInteger _age; Person *_owner;}@end@implementation Dog@end

PersonObserve.m

#import 
#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 
#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:@10 forKey:@"age"]; Dog *d2 = [[Dog alloc] init]; [d2 setValue:@20 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 0;}

结果:

2015-03-07 21:09:34.611 KVC&KOC[3079:122638] zhangsan2015-03-07 21:09:34.612 KVC&KOC[3079:122638] lisi2015-03-07 21:09:34.613 KVC&KOC[3079:122638] dogs.age = (    10,    20)2015-03-07 21:09:34.613 KVC&KOC[3079:122638] dogs.age.sum = 302015-03-07 21:09:34.613 KVC&KOC[3079:122638] dogs.age.avg = 152015-03-07 21:09:34.613 KVC&KOC[3079:122638] dogs.age.max = 202015-03-07 21:09:34.613 KVC&KOC[3079:122638] dogs.age.min = 10Program ended with exit code: 0

 

转载于:https://www.cnblogs.com/yoran-yang/p/4309725.html

你可能感兴趣的文章
HTML多选操作的实现
查看>>
尚硅谷java——网络编程
查看>>
典型用户和场景
查看>>
并查集——poj1308(并查集延伸)
查看>>
POI/JFreeChart
查看>>
1101 Quick Sort
查看>>
vue过滤器
查看>>
开山之震
查看>>
axios详解
查看>>
npm发包注意
查看>>
ubuntu16.04 安装OpenNI并运行kinnectfusion
查看>>
python常用命令(持续) | Commonly used Python command list (con't)
查看>>
IOS6.0 学习第2篇,弹出AlertView
查看>>
博客已搬家,新博地址 http://www.yiven.vip
查看>>
Openstack的nova-network的vlan模式扩展
查看>>
在SContruct中编译.c
查看>>
JavaScript中点击按钮弹出新的浏览器窗口
查看>>
菜鸟Scrum敏捷实践系列(三)用户故事的组织---功能架构的规划
查看>>
让ubuntu开启ssh服务以及让vi/vim正常使用方向键与退格键
查看>>
python中的null值
查看>>