单身实施。阻止外部使用的alloc和init方法

时间:2014-01-01 09:19:11

标签: ios singleton init alloc singleton-methods

我有一个我希望以Singleton的形式实现的类。

我希望通过以下方式创建/访问此类实例的唯一方法是:

+(MYClass*)sharedInstance 

方法。在方法实现中(当然)调用alloc和init。

有没有办法阻止使用alloc和init,或者让它们“空”,如果尝试通过sharedInstance方法创建该类的实例(但是直接通过alloc + init)? / p>

2 个答案:

答案 0 :(得分:6)

如果在实现之外调用init,则将此代码放在头文件中会产生编译时错误:

- (id)init __attribute__((unavailable("cannot use init for this class, use +(MYClass*)sharedInstance instead")));

我发现了这种技术here

更新

您将无法在.m文件中编写[[MYClass alloc] init],但可以使用以下内容:

+ (MYClass *)sharedInstance {
    static MYClass *sharedInstance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [self new];
    });
    return sharedInstance;
}

答案 1 :(得分: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;
}
相关问题