I love iPhone, Android, Cocos2d-x
Objective-C でシングルトンパターン
Objective-C でシングルトンパターンのクラスを作成するメモです。
シングルトンパターンとは、クラスのインスタンスがひとつしか生成されないことを保証するデザインパターンです。NSUserDefaults などがシングルトンなクラスです。
シングルトンなクラスを作成するときのポイントです。
- 静的インスタンスを生成して、ひとつだけ作成したインスタンスを入れておく
- アップルが推奨しているクラスファクトリーメソッド名(sharedInstance や sharedManager) を使用して、インスタンス未生成時のみインスタンスを生成する
- インスタンスがひとつしか生成されないことを保証するために [[Hoge alloc] init] とされた場合の対策をしておく
- retain, retainCount, copyWithZone, release, autorelease をオーバライドしてシングルトン状態が保持されるようにする
で、作成したのが以下のようなコードです。これに必要なメソッドなどを適宜追加して使います。インスタンスを生成する処理を @synchronized(){} で囲うことにより同時に複数のスレッドから実行されたときにも、処理が同時に実行されないようにブロックされ、シングルトン状態を保持できます。
#import "History.h"
@implementation History
static History* sharedHistory = nil;
+ (History*)sharedManager {
@synchronized(self) {
if (sharedHistory == nil) {
sharedHistory = [[self alloc] init];
}
}
return sharedHistory;
}
+ (id)allocWithZone:(NSZone *)zone {
@synchronized(self) {
if (sharedHistory == nil) {
sharedHistory = [super allocWithZone:zone];
return sharedHistory;
}
}
return nil;
}
- (id)copyWithZone:(NSZone*)zone {
return self; // シングルトン状態を保持するため何もせず self を返す
}
- (id)retain {
return self; // シングルトン状態を保持するため何もせず self を返す
}
- (unsigned)retainCount {
return UINT_MAX; // 解放できないインスタンスを表すため unsigned int 値の最大値 UINT_MAX を返す
}
- (void)release {
// シングルトン状態を保持するため何もしない
}
- (id)autorelease {
return self; // シングルトン状態を保持するため何もせず self を返す
}
@end
実際にインスタンスを取得する際は以下のようになります。
History* history = [History sharedManager];
参考サイト
Cocoa Fundamentals Guide: シングルトンインスタンスの作成
先月も今月もほとんどブログを更新していないかった。反省して更新するようにしたいです。
関連する投稿
8 comments
Additional comments powered by BackType
[blog] Objective-C でシングルトンパターン http://is.gd/drjWC
This comment was originally posted on Twitter
メモメモ RT @syuhari: [blog] Objective-C でシングルトンパターン http://is.gd/drjWC
This comment was originally posted on Twitter
[...] Objective-C でシングルトンパターン | Sun Limited Mt.にも載っていた。 [...]
10行目は
sharedHistory = [[self alloc] init];
ですね。
一応お知らせです。
token さんご指摘ありがとうございます!修正させていただきました。
[...] また,シングルトンの作り方はObjective-C でシングルトンパターン | Sun Limited Mt. さんにて勉強させていただきました。 [...]
[...] http://blog.syuhari.jp/archives/2178 [...]
[...] Objectiv-Cでシングルトンクラスを作成するときの作法を調べてみました。 ひとまず”Objectiv-C シングルトン”で検索して上位にきたサイトに載っていたコードを参考に作ってみました。 参考サイト:http://blog.syuhari.jp/archives/2178 [...]