0

OK、この質問は無関係または基本的すぎるように見えるかもしれませんが、私は常に自分が何をしているのか、なぜそれをしているのかを知りたいので、それが私のデザインに合っている場合は、光を当ててください。

だから、これが私が必要なものです:

  • クラスがあるとしましょう
  • ほぼどこからでもそのメソッドを使用したい
  • オブジェクトを渡す代わりに、クラスメソッドと疑似グローバルインスタンスを使用することにしました。

それで、「MyDocumentManager」という名前のクラスがあるとしましょう。


これは私が通常行うことです:

+ (MyDocumentManager*)documentManager
{
     MyDocumentManager* newDocumentManager = [[MyDocumentManager alloc] init];

     if (newDocumentManager)
     {
          // initialize that new document manager
     }
     return newDocumentManager;
}

そしてそれを次のように使用します:

[[MyDocumentManager documentManager] someMethod];

しかし、私は通常、次のような提案をしている人を目にします。

+ (MyDocumentManager*)sharedManager
{
    static dispatch_once_t pred;
    static MyDocumentManager *sharedManager;
    dispatch_once(&pred, ^{
        sharedManager = [[MyDocumentManager alloc] init];
    });
    return sharedManager;
}

だから、ここに私の質問があります:

  • 同じことですか?
  • そうでない場合、違いは何ですか?
  • そのアプローチの長所/短所は何ですか?(メモリ/速度などの観点から)
  • どちらを使用する必要があり、その理由は何ですか?
  • それらは両方とも私がそれらを必要とするものに適合しますか?
4

2 に答える 2

2

それは同じことですか?

いいえ。

そうでない場合、違いは何ですか?

あなたが持っているものは、関数呼び出しごとにクラスの新しいインスタンスを割り当てるため、シングルトンを実装していません。むしろファクトリーメソッドと呼ばれています。シングルトンの定義は、特定のクラス メソッドが常にクラスの同じインスタンスを返すことです。

どちらを使用する必要があり、その理由は?

シングルトンを使用すると便利な場合もありますが、通常は悪い習慣と見なされるため、シングルトンの使用は避ける必要があります。たとえば、カプセル化されたデータを使用するクラスがあり、準クラスレベルのメソッドのみが必要な場合は、クラスメソッドと大量のグローバル/静的変数を実装するよりも、適切に配置されたインスタンス変数を使用してシングルトンを実装する方が適切です (これは、 Objective-C、クラスはメンバー変数を持つことができず、オブジェクトのみを持つことができます)。

どちらも私が必要としているものに合っていますか?

あなたがそれを決定します。

于 2013-03-03T07:45:32.767 に答える
1

「普段やっていること」に貼り付けたコードが壊れています。シングルトンを返しません。呼び出すたびに新しいオブジェクトが返されます (これが ARC でない場合は、それもリークしています)。

人々が提案するように貼り付けたコードは正しいコードです。リークせずに毎回共有オブジェクトを返すだけでなく、スレッドセーフでもあります (オブジェクトの初期化に関する限り、オブジェクトの使用がスレッドセーフかどうかについては何も述べていません)。

于 2013-03-03T07:46:00.540 に答える