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"];  
}
相關文章
相關標籤/搜索