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]);

とやればさきほどセットした値が表示されます。

他のクラスでも別にセットできるんで、もうやりたい放題ですね。