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

Oha*_*gev 2 singleton init singleton-methods alloc ios

我有一个我希望作为Singleton实现的类.

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

+(MYClass*)sharedInstance 
Run Code Online (Sandbox Code Playgroud)

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

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

Kei*_*edy 6

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

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

我在这里发现了这种技术.

更新:

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

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