2009-08-21 9 views
8

シングルトンクラスのメンバーを初期化するのに最適な場所はどこですか?Cocoa - Singletonオブジェクト:メンバ変数を初期化する場所は?

私はAppleの基本的なガイドシングルトンの実装を使用しています。あなたはinitsがどのラインで起こったのかを正確に教えてください。コードは以下の通りである:

static MyGizmoClass *sharedGizmoManager = nil; 

+ (MyGizmoClass*)sharedManager 
{ 
    @synchronized(self) { 
     if (sharedGizmoManager == nil) { 
      [[self alloc] init]; // assignment not done here 
     } 
    } 
    return sharedGizmoManager; 
} 

+ (id)allocWithZone:(NSZone *)zone 
{ 
    @synchronized(self) { 
     if (sharedGizmoManager == nil) { 
      sharedGizmoManager = [super allocWithZone:zone]; 
      return sharedGizmoManager; // assignment and return on first allocation 
     } 
    } 
    return nil; //on subsequent allocation attempts return nil 
} 

- (id)copyWithZone:(NSZone *)zone 
{ 
    return self; 
} 

- (id)retain 
{ 
    return self; 
} 

- (unsigned)retainCount 
{ 
    return UINT_MAX; //denotes an object that cannot be released 
} 

- (void)release 
{ 
    //do nothing 
} 

- (id)autorelease 
{ 
    return self; 
} 
+2

http://boredzo.org/blog/archives/2009-06-17/doing-it-wrongを読むことができます。あなたは本当にリリースを上書きするシングルトンを望んでいますか?それはバグを隠すだけです。 –

+0

そして、あなたがAppleのドキュメントに従っていることをJon Hessに伝える前に、私はAppleのドキュメントに応じてその投稿を書きました。 –

+0

また、クラスには「メンバー」はありません。あなたが得ることができる最も近いのは、クラスの実装ファイル内の静的変数です。とにかく、クラスメンバーはあなたが初期化したいものではありません。あなたが言うことは、シングルトン*インスタンス*のインスタンス*変数です。 –

答えて

18

それはいつもの授業と同じようだ - ブロックの上にこれを追加します。

-(id)init { 
    if (self = [super init]) { 
    // do init here 
    } 

    return self; 
} 

シングルトンが最初にアクセスされたときにそれが呼び出されます。

+0

私はそのinitメソッドを作成する場合は、 sharedManager、そうですか? これをプライベートにすると、init()メソッドをオーバーライドしません。 –

+0

はい、それは直接アクセスできますが、私はそれが必要ではないと思います。シングルトンは初めて必要とされることを確認します。通常のように[[MySingletonClass sharedClass] message]を呼び出すだけです... – Rudi

+0

+1、Jon Hessが指摘しているように、このオブジェクトのインスタンスが1つしか存在しないことを本当に絶対に保証しなければ、 。それは実際にはまれです。一般的には、共有されたインスタンスに簡単にアクセスしたいだけです。静的インスタンスを返す+ sharedInstance(または+ sharedManagerなど)メソッドを実装するだけで済みます。呼び出し側が明示的にユニークなインスタンス。 –

1

他のクラスと同様に、initメソッドで初期化できます。

ただし、シングルトンにメンバー状態が含まれていると、スレッドセーフではなくなる可能性があることに注意してください。シングルトンはいつでもアプリケーションのどこにでもアクセスできるため、異なるスレッドからアクセスすることができます。

関連する問題