Singleton
Singletonの実装
- 内部変数を用いた方法で実装
static TCPState* sharedInstace = nil; + (TCPState *)sharedInstance{ if (!sharedInstace) { sharedInstace = [TCPState new]; } return sharedInstace; }
ただし、シングルトンのインスタンスがnilかどうか(初期化済みかどうか)でif分岐するという方法だとスレッドセーフでは無い為、GCDのdispatch_onceを使う方が良いらしい
- dispatch_once
+ (instancetype)sharedManager { static TCPState *_sharedInstance = nil; static dispatch_once_t oncePredicate; dispatch_once(&oncePredicate, ^{ _sharedInstance = [[self alloc] init]; }); return _sharedInstance; }
こっちで書くと複数スレッドからの呼び出しに対しても一度しか処理が行われない事が保証される