KVO 机制

   KVO 即key(键)-value(值) observer(观察),是绑定技术中的一种常用模型,它可以使一个对象的某一个属性值发生变化时主动通知另一个对象,并触发相应的方法,下面的代码,当subject的name属性改变后,subject会自动通知observer对象,observer对象接受到消息后执行NSLog语句


  

//  main.m

//  dd

//

//  Created by xingjunchao on 14-8-4.

//  Copyright (c) 2014 邢俊超. All rights reserved.

//


#import <UIKit/UIKit.h>

#import "subject.h"

#import "observer.h"


#import "AppDelegate.h"



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

{
    @autoreleasepool {
        
       subject* sub=[[[subjectalloc]init]autorelease];
       observer* obs=[[[observeralloc]init]autorelease];
        [sub addObserver:obsforKeyPath:@"name"options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld)context:NULL ];
       NSString* str=@"crystal";
        
        [subsetValue:str forKeyPath:@"name"];
        
        [sub removeObserver:obsforKeyPath:@"name"];
        
        
        
        returnUIApplicationMain(argc, argv, nil,NSStringFromClass([AppDelegateclass]));
    }
}






//  subject.h

//  dd

//

//  Created by xingjunchao on 14-8-4.

//  Copyright (c) 2014 邢俊超. All rights reserved.

//


#import <Foundation/Foundation.h>

@interface subject :NSObject

@property(nonatomic,retain)NSString* name;

@end




//  subject.m

//  dd

//

//  Created by xingjunchao on 14-8-4.

//  Copyright (c) 2014 邢俊超. All rights reserved.

//


#import "subject.h"

@implementation subject

@synthesize name=_name;

+(BOOL)automaticallyNotifiesObserversForKey:(NSString *)key
{
  if([keyisEqualToString:@"name"])
  {
      return YES;
  }
    return [superautomaticallyNotifiesObserversForKey:key];
}



@end





//  observer.h

//  dd

//

//  Created by xingjunchao on 14-8-5.

//  Copyright (c) 2014 邢俊超. All rights reserved.

//


#import <Foundation/Foundation.h>

@interface observer :NSObject

@end







//  observer.m

//  dd

//

//  Created by xingjunchao on 14-8-5.

//  Copyright (c) 2014 邢俊超. All rights reserved.

//


#import "observer.h"

@implementation observer

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
 if([keyPath isEqual:@"name"])
  {
      NSLog(@"has  changed become %@",[changeobjectForKey:NSKeyValueChangeNewKey ]);
    
  }
   else
    {
        [superobserveValueForKeyPath:keyPath ofObject:object change:change context:context ];
    }
}

@end




结果如下:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值