2011-01-13 16 views
0

私は、多くの場合、次のように設計されたシングルトンクラスを参照してください。iPhone SDK:静的変数を割り当てるときは、nilをチェックする必要がありますか?

@implementation SomeImplementation 

static SomeClass *sharedSomeObject = nil; 

+ (void) someClassMethod { 
    sharedSomeObject = [[SomeImplementation alloc] init]; 
    // do something 
} 

@end 

someClassMethodはいつでも呼び出すことができます - それはsharedSomeObjectの新しいインスタンスを割り当てる前に、最初はnilをチェックする必要がありますか?または、sharedSomeObjectは静的なので、チェックは不要ですか?このようなコードを見ると、私はいつも割り当ての周りにif(!sharedSomeObject)を入れたいと思っています。

答えて

3

はい、絶対に!そうしないと、メソッドが呼び出されるたびに複数のオブジェクトが作成されます。

+ (SomeClass *) shared { 
    static SomeClass *sSingleton; 

    if (! sSingleton) sSingleton = [SomeClass new]; 

    return sSingleton; 
} 

EDIT

この答えは非常に古い、スレッドセーフではありませんし、もはや適切なシングルトンの初期化方法:これは私たちが物事を行う方法です。 GCDで今日のことを行う正しい方法については、this Stackoverflow answerを参照してください。

+0

function-static宣言は意図的であることに注意してください。コードをきれいに保つのに役立ち、+共有メソッドだけの可視性を減らします。このようにすることで、好きな場所で "sSingleton"という名前を再利用することもできます。名前空間の汚染はありません。 – par

+0

また、someClassMethodを呼び出すたびにsharedSomeObjectの前のインスタンスがリークされていることを上記のコードで指摘します。ああ! – par

+0

ありがとうございます。うれしい私は狂っていなかった。そのようにsSingletonを実装すると、どうやってそれを解放しますか?おそらくメモリを節約し、必要に応じて再作成するためにリリースしたいと思うケースがあると私は考えています。 – memmons

2

Objective-Cでシングルトンデザインパターンを使用する場合、Matt Galagherの "SynthesizeSingleton.h"マクロの使用を強く推奨します。シングルトンが必要なくなった場合に解放する(適切な言葉ですか?)メモリなど、シネルート関連のすべてのトピックを扱います。

ここでは、このトピックに関する記事だけでなく、「SynthesizeSingleton.h」ヘッダファイルのダウンロード用リンクを含む「ココア愛をこめて」のウェブサイトへのリンクです:

http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html

あなたをグローバル変数の使用とシングルトンのデザインパターンの使用についての議論、そこにシングルトンを使用するためのさまざまなアプローチについてのいくつかの考察を見つけるでしょう。

+1

すばらしい投稿。私たちはこれを使い始めるでしょう、私はマットのコードはスレッドセーフで、シングルトンの解放を避けるためにいくつかの問題に遭遇します。私が変更する唯一のことは、クラス名の連結です(あまりにも多くの入力)。 +(SomeClass *)は共有されています。もっときれいだ。 – par

関連する問題