2010-12-08 4 views
4

objective-cでシングルトンパターンを作成する方法はありますか?これにより、クライアントコードはそのサブクラスのいずれかの共有インスタンスを取得できますか? Objective-cシングルトンのベースクラス

は、私が試した:

@interface Base : NSObject {} 
+(id)instance; 
@end 

@implementation Base 
static id _instance; 
+(id)instance { 
    if (!_instance) { 
     _instance = [[self alloc] init]; 
    } 
    return _instance; 
} 
@end 

でも呼び出す任意のサブクラスの[AmazingThing instance]は唯一このメカニズムによって作成された最初のインスタンスを返す、どんなタイプ_instanceはありません。任意の清潔な回避策?私は私がなるように実装を変更することで、探していたものを行うことができます

編集

(削除された答えに返信ながら)私は実現:

static NSMutableDictionary *_instances; 

+(id)instance { 
    if (!_instances) { 
     _instances = [[NSMutableDictionary alloc] init]; 
    } 
    id instance = [_instances objectForKey:self]; 
    if (!instance) { 
     instance = [[self alloc] init]; 
     [_instances setObject:instance forKey:self]; 
    } 
    return instance; 
} 

期待どおりに機能するようになりました。それでも、もっと良い方法があるかどうかを知りたいと思っています。

+0

ただの好奇心から外れていますこれのユースケースは何ですか? – ennuikiller

+0

@ennuikiller私はエンティティ/コンポーネントシステムを作っています。プロトタイプを作成するために、すべてのコンポーネントのシングルトンが必要です。 – sharvey

+0

あなたの編集は私の場合には非常に良い解決策です。ありがとう! – Adem

答えて

7

私はこのようにそれを行うだろう:もちろん

+(id) instance 
{ 
    static id theInstance = nil; 
    if (theInstance == nil) 
    { 
     theInstance = [[self alloc] init]; 
    } 
    return theInstance; 
} 

あなたは、クラスごとに異なる静的変数を得るためにあなたのベースクラスのすべてのサブクラスでこのメソッドを必要とするだろう。

#define CREATE_INSTANCE   \ 
+(id) instance     \ 
{         \ 
    static id theInstance = nil; \ 
    if (theInstance == nil)  \ 
    {        \ 
     theInstance = [[self alloc] init]; \ 
    }        \ 
    return theInstance;   \ 
} 

し、各impementationはそれに定義しています:しかし、あなたは、基本クラスのヘッダーで #defineを作成します

@implementation SubClass 

CREATE_INSTANCE 

// other stuff 

@end 
+0

なぜ、[[self class] alloc]の代わりに[self alloc]を使いましたか?後で、基本クラス – onmyway133

+2

の+(id)インスタンスを定義する必要があります。すべてのサブクラスでメソッドを再定義するのは、サブクラスに基づいてインスタンスを取得するのではなく、シングルトンに対して別の静的変数を取得することです。 – JeremyP

1

Objective-C++を使用している場合はokです。あなたができることは、シングルトンオブジェクトの存続期間を管理するメタプログラミングされたC++クラスです。 この方法で、シングルトンパターンを使用し、 Derived* d = Singleton<Derived>::get()を使用してシングルトンにアクセスできます。 さらに参照するために、http://src.chromium.org/viewvc/chrome/trunk/src/base/singleton_objc.hを見ることができます。これは、クロムがそれを行う方法を管理する方法です。

+0

ありがとう、私はそれを見てみましょう。私はメモリとパフォーマンスの改善が私のアップデートで投稿したソリューションと比較されるだろうかと思います。 – sharvey

0

は単にEPPZSingletonを使用します。

厳密に1つのサブクラスを持つことができる基本クラスを作成するのは簡単ですが、より多くのサブクラスを作成し始めると、望ましくない動作が予想されます。 EPPZSingletonはシングルトンの共有コレクションを維持することでこの問題を解決します。

関連する問題