強火で進め

このブログではプログラム関連の記事を中心に書いてます。

シングルトンを実装する時には @synchronized(self)

Objective-Cでシングルトンを実装するのってどう書くんだっけ?と参考になるコードをcocos2dで探していたらこの様な記述がされていました。

static GameSoundManager *sharedManager = nil;

+ (GameSoundManager *) sharedManager
{
	@synchronized(self)     {
		if (!sharedManager)
			sharedManager = [[GameSoundManager alloc] init];
		return sharedManager;
	}
	return nil;
}

他の人の記述を見てなかったら @synchronized(self) の記述を抜かして書く所でした。他の人のコード読むの重要!!

このコードの様に @synchronized(self) {} を行う事で、selfに対する処理が {} の間は別のスレッドから行えないようになります。

この辺りの話については以下を参照。

The Objective-C Programming Language: Threading
https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocThreading.html

mutexについてはこちらを参照。スレッドを使ったプログラムでは重要な要素です。

ミューテックス - Wikipedia
http://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%A5%E3%83%BC%E3%83%86%E3%83%83%E3%82%AF%E3%82%B9

同様の事例としてはこちらのブログの記事などもお勧め。

Objective-Cでatomicな宣言プロパティがatomicであるとは限らない話|中村智武のCTO記
http://ameblo.jp/tomotaken/entry-10818354164.html