スキップしてメイン コンテンツに移動

Objective-Cの手習い:Singletonパターン

今回は『Java言語で学ぶデザインパターン入門』からSingltonパターン。

至って簡単なプログラムだが、Objective-Cでの注意点は3つ。

  1. クラス変数がないこと
  2. メソッドの可視性を設定できないこと
  3. 決まった形式でのコンストラクタのようなものがないこと

Javaなどではクラス変数にSingletonインスタンスを納めておくのが通常だが、Objective-Cではスタティック変数を用意して格納しておくことにする。@implementaion部の最初に以下のように宣言する。

static Singleton* s_singleton = nil;

また、2と3の問題からJavaのようにコンストラクタをプライベートにして生成を制御するということができない。

で、NSObjectから継承された新たにインスタンスを作成しそうな基本メソッドをまずオーバーライドしていく。具体的にはallocWithZone/copyWithZoneなどがそれにあたる。また解放に関する部分も勝手に解放されてはまずいので手を入れておく(retain/retainCount/release/autoreleaseなど)。

具体的にはSingletonクラスの基本メソッドのオーバーライド部分は以下のようになる。

+(id)allocWithZone:(NSZone*)zone
{
    @synchronized(self) {
        if(!s_singleton) {
            s_singleton = [super allocWithZone:zone];
        }
    }
    //アップルのガイドでは最初はインスタンスを返し以降はnilを返すことに
    //なっているが、それだとうまくいかないので以下のように常にインスタンス
    //を返すように変更
    return s_singleton; 
}

-(id)copyWithZone:(NSZone*)zone
{
    return self;
}

-(id)retain
{
    return self;
}
-(unsigned)retainCount;
{
    //解放できないオブジェクトであることを示す
    return UINT_MAX; 
}
-(void)release
{
    return;
}

-(id)autorelease
{
    return self;
}

で肝心のインスタンスを提供するメソッドは以下のようになる。

+(id)getInstance
{
    @synchronized(self) {
        if(!s_singleton) {
            s_singleton = [[self alloc] init];
            printf("インスタンスを生成しました。\n");
        }
    }
    return s_singleton;
}

@synchronizedを入れているのはマルチスレッドへの考慮だ。

実はこの辺りの解説はアップルが提供するデザインガイド「Cocoa Fundamentals Guide」に「シングルトンインスタンスの作成」という解説があり、コードのサンプルも掲載され詳しく説明されている。今回はほとんどその受け売り。

SingletonSample.zip

コメント

このブログの人気の投稿

リピート

Appling 2ndの『リピート』 の記事を読んで、面白そうだったので買って読んでみた。 リピート posted with amazlet on 07.04.01 乾 くるみ 文藝春秋 (2004/10/23) 売り上げランキング: 194098 Amazon.co.jp で詳細を見る そもそもタイムスリップものは好きなジャンルであることと、そのタイトルと紹介されていたストーリーから大好きなケン・グリムウッドの『リプレイ』を連想したからだ。実際、作品の中でも時間を繰り返すタイムスリップを突きつけられた時主人公達はケン・グリムウッドの『リプレイ』を引き合いに出して議論を行う場面もあるので、作者がリプレイを意識しているのは確実だろう。 タイムスリップ物というSF的な文法を使いながら、うまくミステリーの要素を融合させ、ちょっぴり恋愛物のスパイスも利かせてうまい具合にまとまった作品になっている。たまたま今回は筋が読めてしまって「やっぱり」って感じもしたが、一般的には二つの要素がかみ合ってうまく最後まで読者を惹きつけるだろう。 帯には" 『リプレイ』+『そして誰もいなくなった』 "などと銘打ってある。確かに楽しめる作品であるが、ちょっと言いすぎかな。『リプレイ』のオマージュと考えると、以下の点で物足りなさを感じる。 リプレイ(リピート)の期間が短い 『リプレイ』では25年だったリプレイの期間がわずか10ヶ月を遡るだけ。このことで「人生を繰り返す」といっても重みが違ってきている。しかも描かれるのはそのあるサイクルだけだ。 描写される時代 『リプレイ』では自信を失っていた80年代のアメリカから良き時代の60年代、70年代がリプレイで描かれるところが大きな魅力になっている。一方『リピート』では振幅が短いためリピート自体にそういった効果はないが、何故かそもそもの設定は91年となっていて中途半端に懐かしい。 主人公が嫌なヤツ 最初は好青年っぽいがだんだん嫌な面が描かれていく。物語は一人称で綴られているが主人公がそんな状態であるため、読み手としては感情移入がし難い。 とはいえ、結構な長編だが一日で一気に読んでしまったほど面白い。

Jing Project

appling with wordpress で知ったスクリーン・キャプチャのユーティリティ。 Jing Project - スクリーンキャストを共有 via appling with wordpress : これまでスクリーンキャストを撮るには Snapz Pro X を使っていましたが、この Jing に変えてもいいかなぁと思える程よくできてます。しかも無料で使えるのがとてもうれしい。もちろん、スクリーンキャプチャもできますよ。その場で、マーカーや矢印、テキストを加えて編集できるところも便利ですよね。あとはアップロード先を決めてボタンを押すだけの手軽さ。 「スクリーンキャスト」という言葉が使われているが、いわゆる「スクリーンキャプチャ」のこと。気持ちは Jing のサイトにガイドの動画があるので見てみるとよい。なかなか面白い。 TechSmith はWindowsのスクリーンキャプチャとしては歴史あるSnapItの開発元である。 Jing は彼等が開発している新しいスクリーンキャプチャのプロジェクト。SnapItと競合しているようだが、あちらは有価で販売されている製品で編集機能も豊富だったりサポートされる動画形式が違ったりと違いがある。 キャプチャした様子は以下のような感じ。 Uploaded with plasq 's Skitch ! 動作としては、ほとんど Skitch と同等。静止画のキャプチャとして見ると、編集機能の豊富さ、アップロードサイト設定の柔軟さ、スクリーンカムも使用可能など Skitch の方が優れている点が多い。画像公開のためのSkitchの Skitch.com のような専用のWebサイト Screencast.com が用意されているのも同様だ。 Skitch はアップロード後、連携するWebサイトをブラウザで開いてくれるが、 Jing のほうはアップロード後アップロードしたサイトを開かずクリップボードにコードを貼り付けてくれる。1ステップ省けるという訳。 Skitch.com はこのサイト上での管理はあまり考えられていないようで、 Skitch なしではアップロードもできないしサイト上はフォルダもなく画像の一覧がなされるだけ。今のところベータ版のようで無料だが将来の不明。 Screencast.com は 有料...

iTunes 7の感想

iTunes 7が発表されていたので早速使ってみる。 今回はインターフェイスがかなり変わって戸惑う。 今回はアートワークを中心にiPhotoのロールのような見せ方やアートワークが立体的に並んだような見せ方が追加された。見栄えはいいがうれしい? 唯一アートワークを自動的にダウンロードできる機能は便利だ(ただし、なぜかビートルズ関連のアートワークはどれも落とせない)。 一番問題なのは、Volume Logicが使えない! Pluginとして認識はしているようだが、iTunesで音を鳴らしてもVolume Logic側のメーターは反応しない。これは困った。