【コラム】
Singletonパターンの話を続けよう。前回の最後で、Cocoaフレームワークに見られるSingletonの話をすると書いたが、前回の記事について読者から指摘をもらったり、書き漏らしたトピックがあったので、もう一回Singletonの実装の話をすることにする。
まずは、Singletonのインスタンスを取得するメソッドを、複数スレッドから呼ばれたときに排他制御することについて。
前回、「Objective-Cではスレッド同期のための文法は提供されていない」と書いてしまったが、これは誤りだ。昔のObjective-Cにはなかったが、現在では@synchronizedというキーワードが追加されている。これを使うと、ランタイムレベルでの排他制御を行うことができる。GCC 3.3以降、Mac OS Xだと10.3以降から使用可能だ。
この文法に関する詳しい説明は、「Objective-Cプログラミング言語:例外処理とスレッド同期」を参考にしてほしい。リンク先のページにも書いてあるが、この機能を有効にするには、コンパイラで-fobjc-exceptionsスイッチを指定する必要がある。
さて、@synchronizedを使って前回のソースコードを修正すると、次のようになる。
これで、複数スレッドからのアクセスにも耐えうるメソッドになる。
Singletonパターンは、1つの共有するインスタンスを提供するというほかに、そのクラスのインスタンスが1つしか存在しない事を保証するという性質も含む。この性質も実装してみよう。いままでのコードだと、[[Singleton alloc] init]と書いてしまえば、新しいインスタンスが確保されてしまう。これを防ぐのだ。
C++やJavaなどでは、コンストラクタをprivateにすることで、これに対応する。Objective-Cの場合、メソッドの可視性を設定することはできないので、この方法は使えない。仮にメソッドがprivateかどうかコンパイルの時点でチェックできたとしても、objc_msgSendを使えばメッセージとして投げてしまうので、あまり意味はないだろう。
そこで、インスタンスのためのメモリ領域を確保するallocWithZone:メソッドを上書きしてしまう。これにより、1つ目のインスタンスは作成し、それ以降は作成しない、という制御ができることになる。
ついでに、オブジェクトの参照カウンタを制御するretain/release/autoreleaseメソッドや、コピーを行うcopyWithZone:メソッドもつぶしてしまおう。これでインスタンスの複製や削除が行われないことも保証される。
以上のコードは、「Cocoa Fundamental Guide: シングルトンインスタンスの作成」を参考にした。
デザインとしてSingletonだが、そのインスタンスを必要に応じて削除したい場合もあるだろう。つまり、インスタンスは常に1つである。そして、そのインスタンスを必要なときに作成し、使い終わったら削除する、というパターンだ。この場合、削除を行うメソッドを追加することになる。
List 2に、削除のためのメソッドdeleteInstanceを付け加えてみよう。releaseメソッドも変更することになる。
static変数_willDeleteを付け加えてみた。これにより、deleteInstanceが呼ばれたときにだけ、インスタンスが削除されることになる。
次回こそは、Cocoaでの実例の紹介を行おう。
【コラム】ダイナミックObjective-C 第52回 デザインパターンをObjective-Cで - Singleton (3)
【コラム】ライトニングJava 第64回 Servletプログラミング(4) - データスコープ、HTTPリクエスト/レスポンスヘッダ
| トマトを食べれば痩せられる!? -京大ら、新発見の成分で肥満改善効果を実証 [21:00 2/10] |
| JAXA、液体シリコン中に残存する共有結合を観察 -大口径ウェハの実現に期待 [20:11 2/10] |
| NEDOなど、熱膨張が小さな樹脂複合材料ペレットの量産化に成功 [19:22 2/10] |
| 理研、一般顕微鏡を蛍光顕微鏡に強化できるアダプタを試作して性能を実証 [19:15 2/10] |
| 天の川のブラックホールが小惑星を飲み込んでいる - NASAが発表 [18:08 2/10] |
|
熊田曜子が最新DVDで美乳引き立つゴールドビキニ姿を披露『WOMAN~本性~』 [22:30 2/10] エンタメ |
|
「グラビア甲子園」特別賞の新人・藤村椿の"フレッシュ・ヒップ"が弾ける! [22:30 2/10] エンタメ |
|
TVアニメ『エウレカセブンAO』、新キャラおよびメカの設定画を紹介 [22:21 2/10] ホビー |
|
宮本恒靖を迎え「選手のセカンドキャリア」を考える! [22:08 2/10] キャリア |
|
NMB48山田菜々・福本愛菜、恋人モードで妄想セリフ!? [22:08 2/10] キャリア |