T2ThreadFaceとT2Thread

Thousand2chフレームワークには、2chのスレッドの内容と情報を保持するオブジェクトが二種類ある。T2ThreadFaceとT2Thread。何故二種類あるのか?と未来の私が疑問を覚えた時のために理由を覚え書きしておく。
普通に考えればスレッドオブジェクトただ一種類でいい。タイトルやスレッド番号、NSArrayに収納したレスなどを持つオブジェクトだ。レスはログファイルに格納しておいて、必要になったら読み込むようにすればいい。ただしこの場合、レスは一度読み込んだら、スレッドそのものが表示されなくなってもこのスレッドオブジェクトをタイトル表示なんかに利用している板オブジェクトが解放されるまでメモリに居座る。これはちょっと気持ち悪い。
この問題を解決するためには、例えばスレッド表示ビューが表示をやめる時に、スレッドオブジェクトにメッセージを送ってレスを解放するなどしてやればよい。しかしそうすると次の問題が生じる。一つのスレッドオブジェクトを2つのビューが表示していた場合は、一つ目の表示解除でレスを解放する必要はないのである。この問題を解決するためにはretainCountと同じようなシステムを採用する羽目になる。ここらへんで気付いた。retain-releaseと似たり寄ったりのシステムを自前で持つくらいなら、初めから標準のそれを利用すればいいんである。
かくして、板に表示されるスレッドの情報を持つオブジェクト、T2ThreadFaceと、スレッドビューに表示されるスレッドの内容を持つオブジェクト、T2Threadが作られた。ただしこれらが必要とする情報は一部重複している。例えばスレッドのタイトルなんかだ。重複する内容は共有してしまえばいいということで、T2Threadはインスタンス変数にT2ThreadFaceを持つことになった。同時に、板オブジェクトT2ThreadListもNSArrayに収納したT2ThreadFaceを持つ。一見奇妙な関係だが、この2つが全く同じオブジェクトを共有することで、スレッドだけを更新したときにも、板に表示されているレス数などが更新されることになる。
ではT2ThreadFaceからT2Threadへの参照はないのかというと、ない*1。T2ThreadFaceからそれに対応するT2Threadを取得するには、単にthreadメソッドを呼び出すだけだが、内部ではinternalPathを用いてプラグインに問い合わせ、T2Threadのインスタンスを作ってもらって返す*2。この段階でプラグインが噛んでくるので、プラグインはT2Threadのサブクラスを作って利用することが出来る。
上記のT2ThreadFaceとT2Threadの関係は、そのままT2ListFaceとT2Listの関係でもある。

*1:もしこっちでもretain-releaseしていたら循環参照だし、参照だけを持っていたらT2Threadが解放されたときアドレスが無効になる

*2:該当のinternalPathを持つT2Threadがすでに存在していたらもちろんそちらを返す