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することも可能です。

 



こんな記事も関係あるかも。読んでみてね。

コメントを残す

サブコンテンツ

このページの先頭へ