KVO の勘所

アプリを作っていると、「ある値が変化したら・・・」ということをしたくなるもので、KVO と呼ばれる仕組みが Objective-C に用意されています。

「あるクラスの値が変化したら知らせてね」ということを登録できます。便利なんですが、覚えておかないといけないことが 3 つほど。

1. 監視できるのはプロパティで登録しているもの。

同じクラス内の値を監視しようとして、うまく通知が送られないことがあり、なんでかよくわからないことがたまにあったのですが、監視できるのはプロパティだけです。監視したければ、property 登録しろと。知らないとはまります。

 

2. クラスが破棄されるタイミングで通知は消されません。必ず手動で消しましょう。

例えば、ゲームを作っていて通知を登録して画面を切り替えたとたん落ちる、なんでだ?と思ったら通知を消していなかったからということが割とあります。

クラスが消えるタイミングで通知も消えて欲しいところですが残ってしまいます。手動で消しましょう。

これを知らないとはまります。

 

3. options が結構曲者

監視している property 変更の前後の値を知りたければ、options で NSKeyValueObservingOptionNew または、NSKeyValueObservingOptionOld を指定できます。

property で int を監視していて、変化前後の値は特に知りたくなかったんですが、New を指定していたら、エラー発生。理由がさっぱりわからず、options:0 としたらエラーは出なくなりました。

多分、監視対象にしている property の問題だと思いますが、 前後の値を特に知りたくない時には options に 0 が指定でき、それが、謎のエラー回避の方法にもなるんだなと。