23

ですから、かなり単純な質問です。シングルトン パターンの過剰使用の影響を無視します。Objective-C で信頼できるシングルトン パターンを見つけようとしています。私はこれに出くわしました:

@implementation SomeSingleTonClass

static SomeSingleTonClass* singleInstance;

+ (SomeSingleTonClass*)getInstance
{
    static dispatch_once_t dispatchOnceToken;

    dispatch_once(&dispatchOnceToken, ^{
        singleInstance = [[SomeSingleTonClass alloc] init];
    });

    return singleInstance;
}

- (void)someMethodOnTheInstance
{
    NSLog(@"DO SOMET WORK")
}

@end

これにはかなり満足していますが、これは多くのことにつながります。

[[SomeSingleTonClass getInstance] someMethodOnTheInstance];

私の質問は、これが純粋な静的クラスよりも優れている理由です。

@implementation SomeStaticClass

static NSString* someStaticStateVariable;

- (id)init
{
    //Don't allow init to initialize any memory state
    //Perhaps throw an exception to let some other programmer know
    //not to do this
    return nil;
}

+ (void)someStaticMethod
{
    NSLog(@"Do Some Work");
}

実際に得られるのは、ややクリーンなメソッド呼び出しだけです。基本的にこれを交換します:

[[SomeSingleTonClass getInstance] someMethodOnTheInstance];

このため

[SomeStaticClass someStaticMethod];

これは確かに小さな単純化であり、いつでもクラス内にインスタンスを格納できます。これはより知的好奇心です。シングルトンの代わりに静的クラスを使用することで、Objective-C のどの神様を怒らせているのでしょうか? これを考えるのは私が最初ではないと確信していますが、最初に重複検索を行ったことを約束します。私が見つけたいくつかの答えは、古いバージョンのココアに基づいているように感じました.

4

4 に答える 4

3

両方を組み合わせると便利だと思いました。最初に似た標準的なシングルトン パターンを使用すると、次のようになります。

[[MyClass defaultInstance] doSomething];

しかし、同じクラスの他のインスタンスも作成できるようにしたいと考えています。

MyClass *secondInstance = [[MyClass alloc] init];
[secondInstance doSomething];

シングルトン インスタンスのメソッドを呼び出すためのより簡潔なアクセスが必要な場合は、次のようにクラス メソッドを定義します。

// class method to call a method on the singleton instance
+ (void)doSomething
{
    [[MyClass defaultInstance] doSomething];
}

それで、私は使用できます:

[MyClass doSomething];
于 2013-08-16T20:21:25.660 に答える
1

最初の例は、クラスのシングルトンのようなインスタンスを不必要に作成しているようです。あなたの他のコメントから、クラスがプロパティやインスタンス変数を宣言していないように見えるので、私は不必要に言います。オブジェクトの基本的な目的が状態のストレージを提供することであることを考えると、インスタンス変数を持たないオブジェクトが役立つことはめったにありません。

2 番目の例は、インスタンス化されないクラスを示しています。繰り返しになりますが、Objective-C におけるクラスの基本的な目的は、インスタンスのファクトリとして機能することです。そのため、インスタンス化されないクラスは、実際には有用でも必要でもありません。

代わりに、一連の C 関数を提供するだけです。C 関数をクラスに関連付ける必要はまったくありません。したがって、次のようなことを検討してください。

static NSString* someStaticStateVariable;

void someFunction(void)
{
    NSLog(@"Do Some Work");
}

関数は別個の .h/.m ペアにすることも、そうすることが理にかなっている場合 (通常、関数がそのクラスの懸念と密接に関連している場合)、既存のクラスの .h/.m に組み込むこともできます。 )。

于 2013-08-16T21:14:51.347 に答える
1

そのようなクラスで Objective-C の神々を怒らせることはありません。実際、Apple は場合によってはそのパターンを使用することを推奨しています (一般的な設計パターンと ARC を使用してそれらを実装する方法について説明した ARC セッション ビデオの 1 つで、これについて言及したと思います)。

クラスの複数のインスタンスを持つことができるが、デフォルトのインスタンスが必要な場合は、もちろん共有インスタンス アプローチを使用する必要があります。

于 2013-08-16T20:08:04.510 に答える