2

我有一个我希望作为单例实现的类。

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

+(MYClass*)sharedInstance 

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

如果尝试不通过 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 回答