まずはオブジェクトの関連図。
PossessionStoreというオブジェクトをシングルトンで実装したい場合を想定します。
PossessionStoreはNSMutableArrayのプロパティを持ちます。
ヘッダー
#import <Foundation/Foundation.h> @class Possession; @interface PossessionStore : NSObject { NSMutableArray *allPossessions; } // ファクトリーメソッド + (PossessionStore *)defaultStore; @end
ファクトリーメソッド(クラスメソッド)defaultStoreを宣言します。
このメソッドの実装では、PossessionStoreインスタンスが既に生成済みかどうか確認します。
PossessionStoreインスタンスがある場合には、クラスはそれを返し、ない場合は、インスタンスを生成してからそれを返します。
実装
#import "PossessionStore.h" #import "Possession.h" static PossessionStore *defaultStore = nil; @implementation PossessionStore + (PossessionStore *)defaultStore { if (!defaultStore) { // シングルトンを生成する defaultStore = [[super allocWithZone:NULL] init]; } return defaultStore; } // 別のインスタンス生成を防ぐ + (id)allocWithZone:(NSZone *)zone { return [self defaultStore]; } - (id)init { // 既にPossessionStore インスタンスが生成済みの場合 if (defaultStore) { // 既存のものを返す return defaultStore; } self = [super init]; if (self) { allPossessions = [[NSMutableArray alloc] init]; } return self; } - (id)retain { // 何もしない return self; } - (oneway void)release { // 何もしない } - (NSUInteger)retainCount { return NSUIntegerMax; } @end
PossessionStoreインスタンスを保持するグローバルな静的変数を作成します。
クラスのインスタンスが1つだけ生成されるように、+defaultStore、+allocWithZone:、-initを実装し、保持カウントメソッドをオーバーライドして、defaultStoreを他から解放できないようにします。
これで、シングルトンの実装が完了です。