UIKitはKVO(Key-Value Observing)に準拠していない

今作っているライブラリではViewControllerのViewのプロパティを格納するため、Windows Phone7(Silverlight)のViewModelと同様の責務を持つクラスを用意することを考えている。

ViewModelとViewのプロパティを同期させるために、.NET Frameworkではデータバインディングを使うが、UIKitでは同様の機能であるCocoa Bindingに対応していないため、KVO(Key-Value Observing)の機能を利用することを考えているのだが、例えば以下のようなUISwitchのonプロパティを監視するコードを書いても、オブザーバに変更の通知が渡ってこない。

SampleObserver.m
- (void)awakeFromNib
{
  [switchComOnOff addObserver:self 
                  forKeyPath:@"on" 
                     options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) 
                     context:NULL];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
  NSLog(@"KeyPath= %@", keyPath);
  NSLog(@"ofObject= %@", object);
  NSLog(@"change= %@", change);
}

変だと思いつつ、いろいろ調べていたのだが、どうやらUIKitのView群のプロパティは必ずしもKVOに準拠していないらしい。※
参考)
iphone - When does an associated object get released? - Stack Overflow
Cocoa BindingがCocoa Touch/UIKitをサポートしていないのは既知だったが、まさかそれよりもプリミティブなオブザーバパターンを構成するための仕組みであるKVO(Key-Value Observing)もサポートしていないとは。

KVOを利用することでUIKit上でもデータバインドを実装できると踏んでいたのだが、これはまいった。振り出しに戻ることにする。

※KVCには準拠しているものの、恐らくは内部処理でプロパティを経由せずにIvarを直接操作しているのだと思われる。