ふるすたっくえんじにあっぽい人の日記

ASP .NET MVC (C#)、.NET Framework、iOS (Objective-c) アプリ、Androidアプリ (Java)、AWS、たまにLAMPとかプロジェクトマネジメントあたりのお話

【iOS】【C#】シングルトンパターンの実装

開発してるとよく使うシングルトンパターン。

シングルトン(Singleton)パターンとは

そのクラスのインスタンスが1つしか生成されないことを保証するデザインパターンです。アプリケーション全体でいくつも存在すると困るものの実装に使われます。
クライアントサイドの場合、アプリ全体の設定とか。
サーバーサイドだと用途はいっぱいw
なので、シングルトンパターンを実装するときはしっかり実装しましょう!
中途半端な実装は後から見た人が困る上に、原因がわかりづらいバグの元になりますので要注意。。
というわけでObjective-c側から!

Objective-cの場合

マルチスレッドも考慮してあります。
シングルトンパターンの実装にはいろいろなパターンがありますが、これが一番シンプルかなと。

Hoge.h

+ (Hoge *)sharedInstance; 

Hoge.m

+ (Hoge *)sharedInstance {

    static Hoge *instance;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        instance = [[Hoge alloc]initInstance];
    });
    return instance;
}

- (id)init {
    [self doesNotRecognizeSelector:_cmd];
    return nil;
}

- (id)initInstance {
    self = [super init];
    if (self) {
        // なんか処理
    }
    return self;
}

注目するのはdispatch_oneとdoesNotRecognizeSelectorです。

dispatch_once

iOS4で追加されたGCD(Grand Central Dispatch)の機能の一つで、dispatch_once内に書かれたコードは必ず1度だけ実行されます。

doesNotRecognizeSelector

NSObjectのメソッドで、実行されると例外が投げられます。
上の例では[[Hoge alloc]init]みたいに書くと例外が投げられるので
インスタンス複数生成することはできませんね。

長くなってきたのでC#の場合はさらっとw

C#の場合

public class Hoge
{
    private static Hoge _instance = new Hoge();

    private static Hoge GetInstance()
    {
        return _instance;
    }

    private Hoge() {}
}

はい、コンストラクタはちゃんと隠蔽しましょう。