2012-02-09 12 views
0

はsmthです。この合法のように?コンパイルして実行しているようですが、大丈夫ですか?メソッド呼び出し内の静的な設定(シングルトンパターン付き)

私はこの方法では、nilに静的に自分を設定IAM意味を(私のメソッド内で、nilに自分自身を設定することを目指す)

static MyClass * StaticInstance = nil; 

+ (MyClass *) sharedStaticInstance 
{ 
    if (StaticInstance == nil) { 
     StaticInstance = [[MyClass alloc] init]; 
    } 

    return StaticInstance; 
} 

- (void) killStaticSelf 
{ 
    StaticInstance = nil; 
} 

以降

[[MyClass sharedStaticInstance] doSmth]; // our static instance is created 
[[MyClass sharedStaticInstance] killStaticSelf]; // now its killed inside itself method 
[[MyClass sharedStaticInstance] doSmth]; // now it should recreate again 

答えて

1

はい、これは完了です。 sharedStaticInstanceを頻繁に使用しますが、通常はデストラクタを作成しませんが、このクラスの共有インスタンスへの参照がすべて最初にsharedStaticInstanceを通過する限り、おそらく良い考えです。

編集:私はちょうどkillStaticSelfがインスタンスメソッドであることに気付きました - それは私が信じるクラスメソッドであるべきですが、いずれにしても問題はありません。 nilにメッセージを送信すると、Objective-Cで問題が発生しないので、機能スタックは、閉じたとしても

[MyClass killStaticSelf]; 

0

それは合法だが、あなたがする必要がありますARCを使用していない場合にメモリリークを避けるために、変数をnilに設定する前に解放してください。

このようなシングルトンの使用ロジックの理解は私の謙虚な脳の能力を超えています。

2

メモリリークがあります。 最初にStaticInstanceを割り当て解除してから、nilを割り当てる必要があります。

+0

非常によく目撃された –

1

自分のsharedInstanceの方法は、あなたがこのコードで競合状態を得ることができるので、スレッドセーフではありません。

if (StaticInstance == nil) { 
    StaticInstance = [[MyClass alloc] init]; 
} 

- (void) killStaticSelf 
{ 
    StaticInstance = nil; 
} 

上記のコードは保持としてあなたがStaticInstanceを提供していないので、リークを持っていますプロパティ(明らかに)。シングルトンコードをプロパティにラップすることもできますが、同じ静的インスタンスを使用します。

関連する問題