0

シングルトンがあり、シングルトンが「リリース」されたことを示す内部フラグ変数を作成したいと考えています。シングルトン インスタンスを取得すると、それ自体を再初期化する必要があります。

この場合、静的変数を使用することにしました

static BOOL wasReleased = NO; 

destroy 関数で「YES」に設定します。

- (void)destroy
{
    wasReleased = YES;
    ...release internal singleton resources...
}

しかし、シングルトン インスタンスを取得しようとすると、この変数の値は常に「NO」になるため、解放後に内部リソースが再初期化されることはありません。

+ (MySingleton *)sharedInstance
{
    if (sharedCoordinator == nil)
    {
        sharedCoordinator = [[super alloc] init];
        [sharedCoordinator initialize];
    }

    if (wasReleased) 
    {
        [sharedCoordinator initialize];
    }

    return sharedCoordinator;
}

この状況についての私の理解は間違っているかもしれません。明確にしてください。

4

3 に答える 3

1

この状況についての私の理解は間違っているかもしれません、私のためにそれを明確にしてください。

そもそもなぜシングルトンを使っているのですか?シングルトンを解放したり、再初期化したりする必要はありません。これらのことを行う必要がある場合は、必要なときにいつでもクラスの新しいインスタンスを作成する必要がある可能性が非常に高くなります。

また、すべてのクラスが持つ-initializeクラスメソッドと簡単に混同される可能性があるため、インスタンスメソッド名として使用しないことをお勧めします。+initialize

于 2012-06-22T14:33:31.187 に答える
1

静的wasReleasedインスタンス変数を削除し、MySingletonクラスのプロパティにします (合成することを忘れないでください)。

@property (nonatomic, assign) BOOL wasReleased;

次に、-destroyメソッドで:

- (void)destroy
{
    self.wasReleased = YES;
    //...release internal singleton resources...
}

次に(静的ivarを削除しますsharedCoordinator-持っていると思います)

+ (MySingleton *)sharedInstance
{
    static MySingleton *sharedCoordinator = nil;
    if (!sharedCoordinator)
    {
        sharedCoordinator = [[MySingleton alloc] init];
        [sharedCoordinator initialize];
    }

    if (sharedCoordinator.wasReleased) 
    {
        [sharedCoordinator initialize];
        sharedCoordinator.wasReleased = NO; //If you are not doing it in the -initialize method
    }

    return sharedCoordinator;
}
于 2012-06-21T19:02:49.727 に答える
0

これは当面の懸念に対処するものではありませんが、設計を再検討する必要があります。シングルトンを破壊することは良い考えではありません。重要なリソース(画像、ビデオなど)を解放しようとしている場合は、シングルトンで実際のメソッドを作成して、それらを再インスタンス化することができます。

以下は期待どおりに機能しません。

- (id)initSomeClassUsingTheSingleton
{
  mySingletonVariable = [MySingleton sharedInstance];
}

- (void)someOtherFunctionOccuringAfterDestroy
{
  [mySingletonVariable aMethodOnTheSingleton];
}

これはシングルトンを使用するための完全に有効な方法ですが、あなたの場合はそれを行うことはできません。代わりに、シングルトンには次のようなメソッドが必要です。

- (void)aMethodOnTheSingleton
{
  //if resources for method not allocated
    // .. allocate

  // do the rest
}
于 2012-06-21T20:27:49.313 に答える