2

シングルトンとして実装したいクラスがあります。

このクラスのインスタンスを作成/アクセスできる唯一の方法が次の方法であることを望みます:

+(MYClass*)sharedInstance 

方法。alloc と init はメソッドの実装内で呼び出されます (もちろん)。

alloc と init の使用をブロックする方法、またはそれらを「空」にする方法はありますか?

4

2 に答える 2

6

このコードをヘッダー ファイルに配置する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;
}
于 2014-01-01T11:55:13.453 に答える
0

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;
}
于 2014-01-01T09:33:09.760 に答える