iOS プログラミング メモ KVOについて

さっき作った プロジェクト「SingletonTest」 を再利用して、KVO の実験をしてみた。
KVOというのは、Key Value Observing の略で、「オブジェクトの値の変化」を監視するための仕組み。

Objective-C逆引きハンドブック」を読みながら実験してみた。
Amazon CAPTCHA

監視する側とされる側は、次のようにしてみる。
  監視する側: ViewController クラスから作られるインスタンス
  監視される側:AppDataクラスから作られるインスタンス

ソースをいじるのは、監視する側の ViewController.m だけ。
まず、監視するという設定をしてあげる。
今回は、viewDidLoadの中に、次の文言を追加した。

    NSKeyValueObservingOptions options = (NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld);
    [appData addObserver:self forKeyPath:@"intB" options:options context:nil];

 2行目の設定により、appDataというインスタンスの intB という値に変化があった場合に、このクラス(self)の然るべきメソッドを呼び出すように設定がされる。

 そして、その「然るべきメソッド」とは、次のメソッド。これを ViewController.m の中の適当な場所に加える。

 -(void)observeValueForKeyPath:(NSString *)keyPath
   ofObject:(id)object
 change:(NSDictionary *)change
 context:(void *)context
{
    NSLog(@"***Observed");
    NSLog(@"KeyPath = %@", keyPath);
    NSLog(@"change = %@",[change description]);
}

このメソッドは、どんな変化があったのかを表示する機能しかない。

SecondViewController が生成した2番めの画面で、intBの値を変化させた時でも、この監視機能が生きていて、ちゃんとNSLogでメッセージが吐き出されることが確認できる。

必要な作業は、これだけ。
監視される側については、何もする必要がないというので、少し驚いた。


先のソースから、変更点はごく僅かなので、ソースのULは省きます。