0

親クラスと子クラスがあります。子は親から派生します。Child クラスをインスタンス化するだけで、親が直接初期化されることはなく、子によってのみ初期化されます。少なくとも親がシングルトンである必要があります。それがうまくいかない場合は、Child がシングルトンでも問題ありません。次のことを試しましたが、シングルトンに変更されませんでした:

static MySingleton *sharedSingleton;

+ (void)initialize
{
    static BOOL initialized = NO;
    if(!initialized)
    {
        initialized = YES;
        sharedSingleton = [[MySingleton alloc] init];
    }
}

Child クラスは [super init] を呼び出して、Parent をインスタンス化します。ここで私を助けてもらえますか?

編集: ソリューション (アーキテクチャ) の背景情報をいくつか追加します。Web サービスに接続する Web サービス クライアントがあります。接続に関する情報 (認証済み、接続方法など) を持つ基本クラス (親) があり、この基本クラスから派生するさまざまな子クラスがあります。異なる子クラスが必要なのは、1 つの子が一連の Web サービス ロジックを担当し、別の子が別の一連の Web サービス ロジックを担当することです。問題は、接続情報をシングルトンにしたいことです(すべてが1つの接続のみを使用するため、多くはありません)。

4

5 に答える 5

1

よりスレッドセーフなオプションは次のようになります。

+(MySingleton *)singleton {
    static dispatch_once_t pred;
    static MySingleton *shared = nil;

    dispatch_once(&pred, ^{
        shared = [[MySingleton alloc] init];
    });
    return shared;
}
于 2012-11-09T17:29:06.440 に答える
0

あなたが求めていることが意味をなさないことを正しく理解していれば、継承との関係を混同しているようです。あなたが持っている場合:

@interface Parent : NSObject ...
@interface Child : Parent

次に、作成したものはすべて 、それ自体の一部であり、分割する方法はありません。単一のオブジェクトがあります。継承を使用しても、単一の共有親を持つ複数の子は得られません。Child ParentParentChild

多くの子に 1 つの親を共有させたい場合は、Childクラス Parent. 例えば:

@interface Parent : NSObject ...

@interface Child : NSObject

@property (readonly) Parent *myParent;

- (id) initAsChildOf:(Parent *)parent;

...

@end

使用されます:

Parent *theParent = [Parent new];
Child *firstChild = [[Child alloc] initAsChildOf:theParent];
Child *secondChild = [[Child alloc] initAsChildOf:theParent];

必要に応じてParent、シングルトン クラス (1 つのインスタンスのみが可能) または共有インスタンス クラス (1 つの共有インスタンス、他のインスタンスが可能) を作成できます。

リレーションシップとは対照的に、継承では、真のシングルトン クラスから派生させるのは困難です (ただし、不可能ではありません ;-))。そうすると、派生したクラス自体がシングルトンになります。

共有インスタンスクラスから派生できます。そして、派生クラスのインスタンスの不可分な部分ではないインスタンスを 1 つだけ持つことができるように、クラスを作成することができます (これも難しいことです)。

注: これまでの他の回答では、共有インスタンスクラスを生成するためのコードがすべて提供されていました。真のシングルトン クラスはもう少し複雑で (Apple のドキュメントでコードを見つけることができます)、多くの場合、共有インスタンス クラスで十分です。

HTH と私はあなたの質問を完全に誤解していません!

于 2012-11-09T18:19:39.060 に答える
0

他の回答とは少し異なりますが、これはシングルトンを作成する最新の方法です

static MySingleton * volatile sharedInstance = nil;

+(MySingleton*) sharedInstance {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[MySingleton alloc] init];
    });

    return sharedInstance;
}

また、質問の文言とシングルトンの使用目的 (親子関係) により、アーキテクチャを再考する必要があると思います。

于 2012-11-09T17:29:56.937 に答える
0

これの通常のパターンは次のとおりです。

static MySuperclass *singleton = nil;
+ (void)initialize {
    if (self == [MySuperclass class]) {
        singleton = [[MySubclassProbabl alloc] init];
    }
}
于 2012-11-09T17:16:05.140 に答える
0

この行を置きます static BOOL initialized = NO; この行の下に static MySingleton *sharedSingleton; このような

static MySingleton *sharedSingleton;
static BOOL initialized = NO;
+ (void)initialize
{
  if(!initialized)
  {
     initialized = YES;
     sharedSingleton = [[MySingleton alloc] init];
  }
}

それが役立つことを願っています!

于 2012-11-09T17:13:31.233 に答える