0

アプリケーション全体で利用可能なデータを管理するために、アプリケーションでsinlgetonを使用しています。このデータには、次の方法でアクセスします。

static MMProductManager *sharedInstance = nil;
+(MMProductManager*)SharedInstance {
    dispatch_once( &resultsToken, ^(void) {
        if ( ! sharedInstance ) {
            sharedInstance = [[MMProductManager alloc] init];
        }
    });
    return sharedInstance;
}

すべてが期待どおりに機能しています。

Objective Cでは、オブジェクトのメソッドを非表示にする方法はないようですinit。私の場合、インスタンスが複数あると、MMProductManagerデータが複製されます(最良のシナリオ)。

私がやりたいのは、複数のインスタンスをインスタンス化しないようにすることです。他の言語にはこの機能があるようです。つまり、特定のメソッド/クラスをプライベートとしてマークします。私は次のようなものを実装することを考えています:

-(id)init {
    // guard against instantiating a more than one instance
    if ( sharedInstance )
        return sharedInstance;

    if ( (self = [super init]) ) {
        self->_resultsQueue = dispatch_queue_create( kMMResultQLAbel, NULL );
        self->_initialized  = FALSE;

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(handleNotification:)
                                                     name:UIApplicationDidReceiveMemoryWarningNotification
                                                   object:0];

        [self initialize];
    }

    return self;
}

このアプローチは合理的だと思いますか?

init誰かがこのクラスを割り当てて、上記のように呼び出した場合はどうなりますか?オーバーライドするのは合理的でしょう+(id)allocか?もしそうなら、どうすればそれを行うことができますか?

メソッドを公開するという慣習はSharedInstance、他の開発者にこのメソッドを実行するための暗黙のメッセージであることを私は知っていますが、可能であればもう少し制御したいと思います。

4

1 に答える 1

3

オーバーライドしたくない- init(他の理由- initがない場合)-インスタンスを作成するメソッドではありません。これをオーバーライドしたい+ alloc

@implementation SingletonClass

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

@end

このようにして、の複数のインスタンスを(ほぼ)完全に作成することを実際に防ぐSingletonClassことができます。

(誰かが電話にフォールバックしない限り

id trickyDifferentInstance = class_createInstance(objc_getClass("SingletonClass"), 0));

しかし、それは非常にありそうにありません。)

于 2013-02-19T17:04:49.197 に答える