KVC 和KVO浅谈

来源:互联网 发布:灰鸽子软件官网 编辑:程序博客网 时间:2024/05/11 23:47
一、KVC:Key-Value -Coding :直译为:键-值-代码;即:对键值进行改变的代码方法
 
该方法是OC(Object-C)为我们提供的一个不通黄色别墅http://www.326dy.com/过初始化方法而直接改变对象实例变量值的一种非正式Protocol的关键方法之一;
 
通过  [object setValue : value forKey : key];对该对象的对应的实例变量进326电影网http://www.326dy.com/行赋值操作,省略了初试化步奏,使用得当可以大大省略代码量;
 
 
二、KVO:Key-Value - Observe :直译为:键-值-观察;即:对键值对进行监视、观察的方法
 
该方法同样是OC(Object-C)为我们提供的一个不通过初始化方法而直接改变对象实例变量值的一种非正式Protocol的关键方法之一;
 
KVO和KVC同为基础框架类方法,是以后开发,扩展所性喜剧http://www.326ys.com/需要的基础;
 
KVO主要通过
1、设置观察者
 
[object addObserver: observer  forKeyPath:key  options:options  context:context];
 
其中
第一个参数:observer:观察者,即担任观察者的对象。一般设为工程所在界面本身。
 
第二个参数:key:键的路径:即具体要监视的key所对应value的值
 
第三个参数:options:选项,预留参数,一般设置为0;
 
第四个参数:context:上下文:一般设置为Null;
 
2、观察内容发生变化触发的方法
 
- (void)observeValueForKeyPath:(NSString * )keyPath  ofObject:( id )object change:(NSDictionary * )change context:(void * )context{};
 
当所监视key的value发生变化时,自动触发该方法;
 
3、注意编码结束后应该先移去观察者然后,才能释放观察者对象所有权;
 
三、代码演示:(该代码在MRC环境下编辑)
 
复制代码
  1 A.设置将要监视的对象:  2   3 //  StockData.h  4   5 #import <Foundation/Foundation.h>  6   7 @interface StockData : NSObject  8 {  9     NSString *stockName; 10    NSString  *price; 11  12 } 13 @end 14 //  StockData.m 15 #import "StockData.h" 16  17 @implementation StockData 18  19 @end 20  21  22 B、编辑主界面 23 //  MainViewController.h 24 #import <UIKit/UIKit.h> 25  26 @interface MainViewController : UIViewController 27  28 @end 29  30 //  MainViewController.m 31  32 #import "MainViewController.h" 33 #import "StockData.h" 34  35  36 @interface MainViewController () 37  38 @property(nonatomic,retain)StockData *stockForKVO; 39  40 @property(nonatomic,retain)UILabel *aLabel; 41  42 @property(nonatomic,assign)NSInteger number; 43  44 @end 45  46 @implementation MainViewController 47  48 - (void)viewDidLoad { 49     [super viewDidLoad]; 50     // Do any additional setup after loading the view. 51     52     self.number = 0; 53     54     _stockForKVO = [[StockData alloc]init]; 55     56     [_stockForKVO setValue:@"searph" forKey:@"stockName"]; 57  58     [_stockForKVO setValue:[NSString stringWithFormat:@"%ld",_number] forKey:@"price"]; 59     60     [_stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL]; 61     62     self.aLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 200, 100, 30)]; 63     64     self.aLabel.textAlignment = NSTextAlignmentCenter; 65     self.aLabel.textColor = [UIColor orangeColor]; 66     self.aLabel.text  = [_stockForKVO valueForKey:@"price"]; 67     [self.view addSubview:self.aLabel]; 68 //    [self.aLabel release]; 69     70     UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 71     72     btn.backgroundColor = [UIColor whiteColor]; 73     btn.frame = CGRectMake(100, 30, 100, 30); 74     75     [btn addTarget:self action:@selector(handleDown:) forControlEvents:UIControlEventTouchUpInside]; 76     77     [self.view addSubview:btn]; 78     79 } 80  81 - (void)handleDown:(UIButton *)sender{ 82  83     84   85   86   87     _number ++; 88     89     [_stockForKVO setValue:[NSString stringWithFormat:@"%ld",_number] forKey:@"price"]; 90  91 } 92  93  94 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 95  96     if ([keyPath isEqualToString:@"price"]) { 97         98         self.aLabel.text = [_stockForKVO valueForKey:@"price"]; 99        100        101     }102    103    104 105 106 }107 108 109 - (void)dealloc{110     [super dealloc];111     [_stockForKVO removeObserver:self forKeyPath:@"price"];112     [_stockForKVO release];113 114 115 }116 117 118 - (void)didReceiveMemoryWarning {119     [super didReceiveMemoryWarning];120     // Dispose of any resources that can be recreated.121 }122 123 /*124 #pragma mark - Navigation125 126 // In a storyboard-based application, you will often want to do a little preparation before navigation127 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {128     // Get the new view controller using [segue destinationViewController].129     // Pass the selected object to the new view controller.130 }131 */132 133 @end
复制<span style=

 

 
 
 
 
 
(辛苦手敲,转载请注明出处!)
0 0
原创粉丝点击