シングルトンを実装する時には @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