iPhoneアプリ内でアプリケーションスコープのデータを保持する方法③(Singletonクラスに保持する)
How to remain a variable in application scope? No3
③つめは、シングルトンクラスを利用する方法です。
アプリ内で共通して使われる値を保持するクラスを作ってしまいます。各利用箇所でインスタンスをその都度生成するのではなく、インスタンスがあればすでに存在しているインスタンスを返すことで、共通のインスタンスが利用されることになります。
このような場合、JavaなどでもおなじみのSingletonDesignPatternを使うと便利です。
このページに、Objective-Cでシングルトンクラスを作成するための指針が載っていましたので、それを参考に、値保持を行うクラスを作成してみます。
ヘッダファイル
@interface MyAppManager : NSObject { NSString *userName; int userId; } @property(nonatomic, retain)NSString *userName; @property (readwrite) int userId; @end
実装クラス
#import "MyAppManager.h" static MyAppManager *getInstance = nil; @implementation MyAppManager @synthesize userName,userId; + (MyAppManager *)getInstance { @synchronized(self){ if(getInstance == nil){ getInstance = [[MyAppManager alloc] init]; } } return getInstance; } + (id) allocWithZone:(NSZone *)zone { @synchronized(self){ if(getInstance == nil){ getInstance = [super allocWithZone:zone]; return getInstance; } } return nil; } - (id) copyWithZone:(NSZone*)zone { return self; } - (id) retain { return self; } - (unsigned) retainCount { return UINT_MAX; } - (void) release { //nothing } - (id) autorelease { return self; } @end
利用する場合
利用する場合は、以下のようにします。
[MyAppManager getInstance].userName
[MyAppManager getInstance]で、すでにインスタンスが作成されている場合はそのインスタンスが、されていない場合は新規作成されたインスタンスが返ってきますので、そのプロパティを参照します。
もちろん、メドッドを定義すれば前回のApplicationDelegateクラスのようにメソッドをCallすることも可能です。
タグ:iphone