KeyValueCodingのメモ¶
ヒレガス本の復習をして自分の間違いに気がついた。
今までアクセッサメソッドを手書きする時に、必ず[NSObject willChangeValueForKey:]と[NSObject didChangeValueForKey:]を呼出していた。
KVOでそのプロパティが自動変更通知を使用している場合には不要だった。
プロパティーをKVCやドット表記でアクセスした場合だけでなく、アクセッサメソッドにも自動で変更通知をする。
おそらく内部で、メソッドの置換えを行っていて、アクセッサメソッドの前後に[NSObject willChangeValueForKey:]と[NSObject didChangeValueForKey:]の呼び出しを追加しているようだ。
なお、パフォーマンスの改善等の理由でより細かく通知を制御したい場合は手動変更通知と呼ばれる方法が存在する。
+ (BOOL) [NSObject automaticallyNotifiesObserversForKey:(NSString *)inKey]
をオーバーライドして、手動変更通知したいプロパティ名でNOを返すようにすると、そのプロパティ名は手動変更通知と見なされる。
手動変更通知にしたプロパティ名でKVOに対応させるには、アクセッサメソッドでwiiChangeValueForKeyとdidChangeValueForKeyの対を呼ばなければならない。
すいません。いままで知りませんでした。 今までかなりパフォーマンスが悪いプログラムを各地で書いていたようです。 本当にすいません。
- 参考文献
ADCのKeyValueObserving.pdfとKeyValueCoding.pdfとヒレガス本
Comments
comments powered by Disqus