基于kvo的观察者模式

以下是我自己写的代码,方便新手理解kvo模式的流程。


思路,创建Person类,年龄属性,

show类负责显示Person对象,年龄显示的变化。

用kvo模式。

#import <Foundation/Foundation.h>

#import "Person.h"

#import "Show.h"

int main(int argc, const char * argv[]) {

    

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

    

    p.age=11;

    

    Show *s = [[Show alloc]initWithPerson:p];

    

    [p setValue:@22 forKey:@"age"];

    [p setValue:@23 forKey:@"age"];

    

    

   // NSLog(@"%ld",p.age);

    return 0;

}


--------------------


#import <Foundation/Foundation.h>


@interface Person : NSObject


@property(nonatomic,copy)NSString *name;

@property(nonatomic,assign)NSInteger age;


@end


--------------------

#import "Person.h"


@implementation Person


@end


--------------------

#import <Foundation/Foundation.h>

#import "Person.h"


@interface Show : NSObject


@property(nonatomic,retain)Person *person;


- (id)initWithPerson:(Person *)per;


@end

------------------------

#import "Show.h"

@implementation Show


- (id)initWithPerson:(Person *)per{

    self = [super init];

    

    if(self){

        _person = per;

        /*注意这里:把创建的per对象,即p,赋值给show里面的Person类属性,即设置,要拿出来还要生成get方法,所以这里不能简单的写个属性,直接@property()即可。*/

        //_person = [per retain];

        

        [_person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

        

    

    }

    return self;

}

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

{

    if([keyPath isEqualToString:@"age"]){

        

    NSNumber *age = [change objectForKey:@"new"];

    

    NSInteger newage = [age integerValue];

    

    NSLog(@"现在的age%ld",newage);

    }else{

    

        NSLog(@"error");

    }

    

}


- (void)dealloc{


    [_person removeObserver:self forKeyPath:@"age"];

    


}


@end



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值