シングルトンとして実装したいクラスがあります。
このクラスのインスタンスを作成/アクセスできる唯一の方法が次の方法であることを望みます:
+(MYClass*)sharedInstance
方法。alloc と init はメソッドの実装内で呼び出されます (もちろん)。
alloc と init の使用をブロックする方法、またはそれらを「空」にする方法はありますか?
シングルトンとして実装したいクラスがあります。
このクラスのインスタンスを作成/アクセスできる唯一の方法が次の方法であることを望みます:
+(MYClass*)sharedInstance
方法。alloc と init はメソッドの実装内で呼び出されます (もちろん)。
alloc と init の使用をブロックする方法、またはそれらを「空」にする方法はありますか?
このコードをヘッダー ファイルに配置するinit
と、実装の外部で呼び出された場合にコンパイル時エラーが発生するはずです。
- (id)init __attribute__((unavailable("cannot use init for this class, use +(MYClass*)sharedInstance instead")));
このテクニックはこちらで見つけました。
アップデート:
[[MYClass alloc] init]
.m ファイルに書き込むことはできませんが、次のものを使用できます。
+ (MYClass *)sharedInstance {
static MYClass *sharedInstance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [self new];
});
return sharedInstance;
}
arc を使用している場合は、コンパイラ フラグ -fno-objc-arc をファイルに追加します。
「alloc + init」は sharedManager メソッドを呼び出します。
static MyGizmoClass *sharedGizmoManager = nil;
+ (MyGizmoClass*)sharedManager
{
if (sharedGizmoManager == nil) {
sharedGizmoManager = [[super allocWithZone:NULL] init];
}
return sharedGizmoManager;
}
+ (id)allocWithZone:(NSZone *)zone
{
return [[self sharedManager] retain];
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
- (id)retain
{
return self;
}
- (NSUInteger)retainCount
{
return NSUIntegerMax; //denotes an object that cannot be released
}
- (void)release
{
//do nothing
}
- (id)autorelease
{
return self;
}