トップ «前の日記(2015-12-25) 最新 次の日記(2016-01-25)» 編集

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|

2015-12-31 [Cocoa]Singleton

大晦日になって、自分が知らなかったことに気がついてしまった。

マルチスレッドの環境でシングルトンを実装する場合、ロックが思っていたが、Swiftでは状況が異なるようだ。

Objective-Cで実装する場合、以下の通り。

+ (instancetype)sharedInstance {
    static id _sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedInstance = [[self alloc] init];
    });
 
    return _sharedInstance;
}

Swiftだとstatic変数はクラスアクセス時に生成されるので、以下のように記述できる。

class Singleton {
    static let sharedInstance = Singleton()
}

シングルトンなインスタンス生成時に設定が必要な場合は以下となる。

class Singleton {
    static let sharedInstance: Singleton = {
        let instance = Singleton()
        // setup code
        return instance
    }()
}

もし、シングルトン以外のインスタンス生成を許したくない場合は、C++でコンストラクタをpriateにするのと同様に、privateなinit()関数を用意すればいい。

    private init() {
        // setup code
    }

_ 【Cocoa練習帳】

http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)
Qiita

トップ «前の日記(2015-12-25) 最新 次の日記(2016-01-25)» 編集