oc学习之旅:KVO

#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 = [[[Bank alloc] init] autorelease];

        while (1) {

             [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];

//            [bank setValue:[NSNumber numberWithInt:10.0] forKeyPath:@"_userA.count"];

//            [bank myChange];

            Person * p = bank.accountArr[4];

            [bank.accountArr[4] myChange];

        }

               

    }

    return 0;

}


Bank.h

#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


Bank.m

#import "Bank.h"


@implementation Bank


@synthesize userA = _userA;

@synthesize accountArr = _accountArr;

- (void)dealloc

{

    //2.移除掉观察者身份 ARCARC都要写

    [self removeAll];

    [_accountArr release];

    [_userA removeObserver:self forKeyPath:@"count"];

    [_userA release];

    [super dealloc];

}


- (id)init

{

    self = [super init];

    if (self) {

        _userA = [[Person alloc] init];

        //KVO写法

        /*1.添加观察者

         参数一:观察者对象

         参数二:观察着对象的某一个属性

         参数三:改变前后的值

        */

        [_userA addObserver:self forKeyPath:@"count" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:NULL];

        

        _accountArr = [[NSMutableArray alloc] init];

        

        for (int i =0; i <10; i++) {

            Person *p = [[Person alloc] init];

            

            

            p.name = [NSString stringWithFormat:@"zhangsan%2d",i];

            [_accountArr addObject:p];

            [p addObserver:self forKeyPath:@"count" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:NULL];


            

            

            [p release];

        }

        

    }

    return self;

}

-(void)removeAll

{

    for(Person *p in _accountArr)

    {

        [p removeObserver:self forKeyPath:@"count" ];

        [p release];

    }

}

//系统自动调用 不许手动调用 当监听的属性发生变化时自动调用

//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,[change objectForKey:@"new"]);

    }

//    NSLog(@"%@,%@,%@",object,keyPath,change);

}


@end


Person.h

{

    float _count;

    NSString *_name;

}

@property (nonatomic,assign) float count;

@property (nonatomic,assign) NSString * name;

-(void)myChange;


Person.m

@synthesize count = _count;

@synthesize name = _name;


-(void)dealloc

{

    self.name = nil;

    [super dealloc];

}


- (id)init

{

    self = [super init];

    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"];

 */

    }

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值