システムにシングルトンを入れたいのですが、呼び出し元が何らかの「sharedInstance」メソッドを介してそれにアクセスするのではなく、シングルトンを使用していることに気付かないようにしたいのです。発信者が次のように言うことができるようにしたい:
MyClass *dontKnowItsASingleton = [[MyClass alloc] init];
これを実現するために、次のようにallocをオーバーライドしてみました。
// MyClass.m
static MyClass *_sharedInstance;
+ (id)alloc {
if (!_sharedInstance) {
_sharedInstance = [super alloc];
}
return _sharedInstance;
}
私の質問は:これは大丈夫ですか?動作しているようですが、これまでallocをオーバーライドしたことはありません。また、問題がなければ、これまで行ってきたdispatch_onceアプローチではなく、常にこの手法を使用できますか?..。
+ (id)sharedInstance {
static SnappyTV *_sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[self alloc] init];
});
return _sharedInstance;
}