-5

これは私のシングルトンのコードです

+ (ALData *)sharedInstance {

    static ALData *_shared;
    if(!_shared) {
        static dispatch_once_t oncePredicate;
        dispatch_once(&oncePredicate, ^ {
            _shared = [[super allocWithZone:nil] init];
        });
    }

    return _shared;
}

+ (id)allocWithZone:(NSZone *)zone { return [self sharedInstance]; }
- (id)copyWithZone:(NSZone *)zone { return self; }
#if (!__has_feature(objc_arc))
- (id)retain { return self; }
- (unsigned)retainCount { return UINT_MAX; }
- (void)release {}
- (id)autorelease { return self; }
#endif

今、私が見たすべてのシングルトンはこの方法で呼び出されています:

[[SINGLETON sharedInstance] instanceMethod];

しかし、私はこの方法で呼び出したい:

[SINGLETON classMethod];

メソッドを作成するときにこれを行うには、次のようにします。

+ (BOOL)decide:(BOOL)var {
    [self sharedInstance];
    if (var)
        return NO;
    else
        return YES;
}

代わりに、最初の方法で続行したい場合は、次の方法でメソッドを宣言する必要があります。

- (BOOL)decide:(BOOL)var {
    if (var)
        return NO;
    else
        return YES;
}

そして、私がそれを呼び出すとき、私は書く必要があります:

[[SINGLETON sharedInstance] decide:YES];

私の質問は次のとおりです。これら2つのアプローチの違いは何ですか? パフォーマンスの点でも、デザイン パターンのレベルでも。これを知りたいのは、審美的に優れた方法は 2 番目のsharedInstance.

私の質問が明確であることを願っています

4

2 に答える 2

1

Singletonと Class メソッドの束を持つ Classの主な違いは、Singletonが何らかの状態を保持できることです。たとえば、データの配列やブール フラグなどです。を呼び出すことsharedInstanceで、このクラスの唯一無二のインスタンスにアクセスできます。これは維持されています (データの状態はそこに保持されます)。Singleton確かに、いくつかのクラス メソッドをシングルトン クラスに追加することはできますが、それらは機能しますが、パターンを回避することになります。

于 2013-07-17T13:31:45.773 に答える
0

共有インスタンスを返すプロパティを作成し、それを呼び出すだけです。

-(YourSingleton *)sharedStore
{
    return [Singleton sharedInstance];
}

それから電話する

[self.sharedStore decide:YES];
于 2013-07-17T17:13:42.017 に答える