どうも。
シングルトンをそこそこに実現する方法。
前提としては、
ARC (Automatic Reference Counting) を採用していること。
(だいたい、このブログでの覚え書きはARC採用してる前提)
Objective-Cという言語の特性上、
厳密で完全なシングルトンを実現するのは、
なかなか難しいので、
「そこそこにシングルトンのような構造」にしておく。
例えば、
aClassというクラスを、
シングルトンっぽく実装するなら…。
(aClass.m内)
static aClass *_instance;
+ (void)initialize {
@synchronized(self) {
if (_instance == nil) {
_instance = [[aClass alloc] initInternal];
}
}
}
+ (aClass *)sharedInstance {
return _instance;
}
- (id)init {
[self doesNotRecognizeSelector:_cmd];
return nil;
}
- (id)initInternal {
self = [super init];
return self;
}
+ (void)initialize {
@synchronized(self) {
if (_instance == nil) {
_instance = [[aClass alloc] initInternal];
}
}
}
+ (aClass *)sharedInstance {
return _instance;
}
- (id)init {
[self doesNotRecognizeSelector:_cmd];
return nil;
}
- (id)initInternal {
self = [super init];
return self;
}
(aClass.h内)
- (id)init UNAVAILABLE_ATTRIBUTE;
デフォルトの初期化メソッドのinitが機能しないようにし、
代わりにinitInternalを定義する。
もちろん、
initInternalをコールすることは可能ではあるが、
「それはしないでね♡」
という約束事にしておく。
それでは。
ちゃお☆
まこぴー。