NSArrayにretainさせない方法

delegateというかObserverというかListenerというか、そういうオブジェクトって、たいがいにおいて循環参照になりがちだ。通知してもらうオブジェクトは操作するオブジェクトを保持してることが多く、操作されるオブジェクトは通知する対象を保持しなくてはいけない。ここで、普通にobserverをobservableがretainする場合、相互に所有権を保持することになり、一生releaseされなくなってしまう。

UIKitなんかを見てると、delegateなプロパティはretainじゃなくてassignになってることが多い。なるほど。


と思ったんだけど、Observerを複数登録したいときってどうすれば良いのか困った。NSArrayとかに保存しておきたいんだけど、普通にretainするし、普通それが良いだろう。さて困った。


こういうときは、retainせずにObserverを保持するようなオブジェクトを一度作ると良いらしい。で、NSValueっていうクラスがあって、そういうのをやってくれる。

http://omegadelta.net/2010/03/08/objective-c-nsarray-of-weak-references/

はいできたー。