iOS开发笔试面试- KVC/KVO简单使用

1、对于KVC模式(Key Value Coding):json

一、其实在实际开发中用得比较多得就是:接收到json数据以后,经过解析,解析成NSDictionary,而后再把字典对应的字段创建一个Model,在Model里面自定义一个类方法+(instancetype)modelWithDictionary:(NSDictionary *)keyDictionary方法中调用设计模式

[self setValuesForKeysWithDictionary:jsonObject];

从而达到咱们想要的效果,将字典装成Model。ide

二、而后对于一些想要特殊处理的字段能够调用如下方法来进行特殊处理,好比里面有些key是字典类型,则能够经过如下方式搞定:spa

-(void) setValue:(id)value forKey:(NSString *)key 
{ 
  if([key isEqualToString:@"products"]) 
  { 
    for(NSMutableDictionary *productDict in value) 
    { 
      Prodcut *product = [[Product alloc] initWithDictionary:prodcutDict]; 
      [self.products addObject:product]; 
    } 
  } 
}

三、还有一种状况,就是里面的Key压根就没定义,能够经过重写如下这个方法来从新把key和value对应上号:设计

- (void)setValue:(id)value forUndefinedKey:(NSString *)key 
{ 
    if([key isEqualToString:@"nameXXX"]) 
        self.name = value; 
    if([key isEqualToString:@"ageXXX"]) 
        self.age = value; 
    else 
        [super setValue:value forKey:key]; 
}



2、对于KVO设计模式(KVO的简单使用):指针

Key Value Observing, 顾名思义就是一种observer 模式用于监听property的变化,KVO跟NSNotification有不少类似的地方, 用addObserver:forKeyPath:options:context:去start observer, 用removeObserver:forKeyPath:context去stop observer, 回调就是observeValueForKeyPath:ofObject:change:context:。code

KVO 的实现也依赖于 Objective-C 强大的 Runtime 。orm

简单概述下 KVO 的实现:server

当你观察一个对象时,一个新的类会动态被建立。这个类继承自该对象的本来的类,并重写了被观察属性的 setter 方法。天然,重写的 setter 方法会负责在调用原 setter 方法以前和以后,通知全部观察对象值的更改。最后把这个对象的 isa 指针 ( isa 指针告诉 Runtime 系统这个对象的类是什么 ) 指向这个新建立的子类,对象就神奇的变成了新建立的子类的实例。对象

原来,这个中间类,继承自本来的那个类。不只如此,Apple 还重写了 -class 方法,企图欺骗咱们这个类没有变,就是本来那个类。更具体的信息,去跑一下 Mike Ash 的那篇文章里的代码就能明白,这里就再也不重复。

    下面是从另一个博客搞过来的示例代码:

@interface StockData : NSObject {  
    NSString * stockName;  
    float price;  
}  
@end  
@implementation StockData  
@end
- (void)viewDidLoad  
{  
    [super viewDidLoad];  
  
    stockForKVO = [[StockData alloc] init];  
    [stockForKVO setValue:@"searph" forKey:@"stockName"];  
    [stockForKVO setValue:@"10.0" forKey:@"price"];      
    [stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];  
  
    myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];  
    myLabel.textColor = [UIColor redColor];  
    myLabel.text = [stockForKVO valueForKey:@"price"];  
    [self.view addSubview:myLabel];  
     
    UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
    b.frame = CGRectMake(0, 0, 100, 30);  
    [b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];  
    [self.view addSubview:b];  
  
}
-(void) buttonAction  
{  
    [stockForKVO setValue:@"20.0" forKey:@"price"];  
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context  
{  
    if([keyPath isEqualToString:@"price"])  
    {  
        myLabel.text = [stockForKVO valueForKey:@"price"];  
    }  
}
- (void)dealloc  
{  
    [stockForKVO removeObserver:self forKeyPath:@"price"];  
}
相关文章
相关标签/搜索