アプリケーション全体で利用可能なデータを管理するために、アプリケーションで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
、他の開発者にこのメソッドを実行するための暗黙のメッセージであることを私は知っていますが、可能であればもう少し制御したいと思います。