KVCとKVO

1287 ワード

KVC

  • (Key Value Coding)、キー値符号化、キー値(文字列)によって属性にアクセスするメカニズムによって、属性値
  • を間接的に変更する.
  • 使用方法
  • 賦課setValue:forKey:
  • 例えば:[person setValue:@"Jack" forKey:@"name"];、このメソッドを実行するとsetName:メソッドが優先的に呼び出され、このメソッドがない場合はnameまたは_が直接変更されます.nameこのメンバー変数
  • valueForKey:
  • 例えば:id name = [person valueForKey:@"name"];、このメソッドを実行するとnameメソッドが優先的に呼び出され、このメソッドがなければnameまたは_が直接読み出されます.nameこのメンバー変数


  • KVO

  • (Key Value Observing)、リスニングモデル属性値の変更
  •  //cc aa name 
    [aa addObserver:cc forKeyPath:@"name" options: NSKeyValueObservingOptionOld context:nil];
    
    // cc 
    /**
     *  object keyPath 
     */
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
        NSLog(@" %@ %@ , %@", object, keyPath, change);
    }
    // 
    - (void)dealloc
    {
        [self.p1 removeObserver:self forKeyPath:@"name"];
    }
    
  • KVOはRuntimeメカニズムに基づいて実現された
  • である.
  • オブジェクトがaddObserver:forKeyPath:options:context:を実行すると、システムは実行中に動的に新しいサブクラスを作成し、オブジェクトのisaポインタをそのクラスに向けます.このクラスはsetメソッドを書き換え、setメソッドではsuperのsetメソッドを実装し、リスナーのobserveValueForKeyPath:ofObject:change:context:メソッドはリスナー属性値の変更を通知します.