objective-cでシングルトンパターンを試してみた。
前回共通のデータを保持する方法について書きましたが試してみました。
先駆者がいるって嬉しいです。
前回述べた通り、まずここの方のサイトのソースコードをコピペします。
そしたら、すべてのオブジェクトでデータを共有したいクラスを作ります。
自分の場合は
DataSet.mって作りました。
そしたらDataSet.hには
#import <Foundation/Foundation.h>
@interface DataSet : NSObject {
NSString *test;
}
- (void) setTest:(NSString *)test;
- (NSString *)getTest;
+ (DataSet*)sharedManager;
@end
と作ります。
そしてDataSet.mの方には
@implementation DataSet
static DataSet* sharedDataSet = nil;
+ (DataSet*)sharedManager {
//インスタンスを1つに保持するための同期処理
//C#erの人はlockと同じ
@synchronized(self) {
//インスタンスが無い場合alloc実行
//インスタンスの生成
if (sharedDataSet == nil) {
sharedDataSet = [[self alloc] init];
}
}
returnsharedDataSet;
}
+ (id)allocWithZone:(NSZone *)zone {
@synchronized(self) {
if (sharedDataSet == nil) {
sharedDataSet = [super allocWithZone:zone];
return sharedDataSet;
}
}
returnnil;
}
- (id)copyWithZone:(NSZone*)zone {
returnself; // シングルトン状態を保持するため何もせず self を返す
}
- (id)retain {
returnself; // シングルトン状態を保持するため何もせず self を返す
}
- (unsigned)retainCount {
returnUINT_MAX; // 解放できないインスタンスを表すため unsigned int 値の最大値 UINT_MAX を返す
}
- (void)release {
// シングルトン状態を保持するため何もしない
}
- (id)autorelease {
returnself; // シングルトン状態を保持するため何もせず self を返す
}
- (void)setTest:(NSString *)tests {
test = tests;
}
- (NSString *)getTest {
return test;
}
@end
お得意の9割9分9厘コピペです。
青い所が一応付け足しました。
値をセットするためのsetTestメソッド
値をゲットするためのgetTestメソッド
が追加されてます。
あとは一番最初に読み込まれる
AppDelegate.mなどのどっかで
DataSet *dataSet = [DataSet sharedManager];
NSString *test = @"ぼらぎのーる";
[dataSet setTest:test];
とやります。
これでインスタンスを生成して、値をいれます。
あとは他のクラスなりで
DataSet *dataSet = [DataSet sharedManager];
NSLog(@"%@",[dataSet getTest]);
とやればさきほどセットした値が表示されます。
他のクラスでも別にセットできるんで、もうやりたい放題ですね。