oc学习之旅:KVO
来源:互联网 发布:查看linux网络地址 编辑:程序博客网 时间:2024/06/06 11:49
#import <Foundation/Foundation.h>
#import "Bank.h"
#import "Person.h"
int main(int argc,const char * argv[])
{
@autoreleasepool {
/*
KVC:义字符串替代访问器(getter setter)修改成员变量
KVO:Key Value Observer 键值观察者
适用范围:监听对象的某一个属性是否发生变化
有观察者对象A 被观察对象B
1.将A作为B对象的观察者 [A addObserver:A forKeyPath:B的属性(count) options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:NULL];
2.当程序的任意位置修改了B对形象的这个属性(count)
3.系统会自动触发A对象中的 observeValueForKeyPath方法
4.dealloc 中移除观察者身份 removeObserver
*/
Bank *bank = [[[Bankalloc] init]autorelease];
while (1) {
[[NSRunLoopcurrentRunLoop] runUntilDate:[NSDatedateWithTimeIntervalSinceNow:1]];
// [bank setValue:[NSNumber numberWithInt:10.0] forKeyPath:@"_userA.count"];
// [bank myChange];
Person * p = bank.accountArr[4];
[bank.accountArr[4]myChange];
}
}
return 0;
}
#import <Foundation/Foundation.h>
#import "Person.h"
@interface Bank : NSObject
{
Person *_userA;
NSMutableArray *_accountArr;
}
@property (nonatomic,assign)Person *userA;
@property (nonatomic,retain)NSMutableArray *accountArr;
@end
#import "Bank.h"
@implementation Bank
@synthesize userA = _userA;
@synthesize accountArr =_accountArr;
- (void)dealloc
{
//2.移除掉观察者身份 ARC非ARC都要写
[selfremoveAll];
[_accountArr release];
[_userAremoveObserver:selfforKeyPath:@"count"];
[_userArelease];
[superdealloc];
}
- (id)init
{
self = [superinit];
if (self) {
_userA = [[Personalloc] init];
//KVO写法
/*1.添加观察者
参数一:观察者对象
参数二:观察着对象的某一个属性
参数三:改变前后的值
*/
[_userAaddObserver:selfforKeyPath:@"count"options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOldcontext:NULL];
_accountArr = [[NSMutableArrayalloc] init];
for (int i =0; i <10; i++) {
Person *p = [[Personalloc] init];
p.name = [NSStringstringWithFormat:@"zhangsan%2d",i];
[_accountArraddObject:p];
[p addObserver:selfforKeyPath:@"count"options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOldcontext:NULL];
[prelease];
}
}
return self;
}
-(void)removeAll
{
for(Person *pin _accountArr)
{
[p removeObserver:selfforKeyPath:@"count" ];
[prelease];
}
}
//系统自动调用 不许手动调用 当监听的属性发生变化时自动调用
//1.监听的属性(Person class) 2.监听的对象 3.属性变化的新旧值 4.NULL
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"count"]) {
Person *p = (Person *)object;
NSLog(@"%@ %@",p.name,[changeobjectForKey:@"new"]);
}
// NSLog(@"%@,%@,%@",object,keyPath,change);
}
@end
{
float _count;
NSString *_name;
}
@property (nonatomic,assign)float count;
@property (nonatomic,assign)NSString * name;
-(void)myChange;
@synthesize count = _count;
@synthesize name = _name;
-(void)dealloc
{
self.name =nil;
[superdealloc];
}
- (id)init
{
self = [superinit];
if (self) {
_count = 100;
}
return self;
}
-(void)myChange
{
if (_count>10) {
//_count -=10;
//直接访问成员变量不能触发KVO 如_count = 100;不能触发KVO
//需要间接访问成员变量
/* 1.
float t =self.count;
t -= 10;
self.count =t;
*/
/* 2.点语法可以出发KVO
*/
self.count -=10;
/* 3.
[self willChangeValueForKey:@"count"];
_count -= 10;
[self didChangeValueForKey:@"count"];
*/
}
}
- oc学习之旅:KVO
- OC学习之KVO
- OC之KVC、KVO 学习
- OC学习篇之-----KVO
- OC学习总结之KVC KVO 通知
- OC之KVO
- OC学习篇之---KVC和KVO操作
- OC高级语法之KVC和KVO的学习
- OC学习篇之---KVC和KVO操作
- OC学习总结之KVC KVO 通知
- OC学习:KVC和KVO
- OC基础之KVC,KVO
- OC学习——KVC KVO NSNotification
- OC学习日记11-KVC和KVO
- OC KVO
- OC-KVO
- OC-KVO
- OC-KVO
- MQTT的学习研究(2)moquette-mqtt 的使用之mqtt broker的启动
- 机器学习算法与Python实践之(五)k均值聚类(k-means)
- APACHE 安装
- Solr Cookbook学习记录 - Facet学习
- linux的eclipse下配置javah
- oc学习之旅:KVO
- 第十七周上机实践项目——委派任务
- ajax打开新窗口实现
- 深入理解java:注解(annotation)的基本概念
- MQTT的学习研究(4)moquette-mqtt 的使用之mqtt Blocking API客户端订阅并接收主题信息
- Solr Cookbook学习记录 - Highlighting学习
- 微信公众平台开发(十) 消息回复总结
- Java的安全学习(包括加密,数字签名,证书和认证)
- 关于货币