如果在其实现中使用NS_UNAVAILABLE,则Xcode 7.3报告编译器错误

时间:2016-06-30 06:07:14

标签: objective-c xcode

所以我正在编写一个单例对象,并希望将init方法标记为NS_UNAVAILABLE

来自Safe way to create singleton with init method in Objective-C第二回答的

__attribute__((unavailable("Use 'sharedInstance' instead of 'init' as this class is singleton.")));

问题是第二个答案,它不起作用:

但是,Xcode 7.3在单例实现中提示我编译错误:

@interface NetWorkService : NSObject

+(nonnull instancetype)sharedInstance;
-(nonnull instancetype)init NS_UNAVAILABLE;

@end

@implementation NetWorkService

+(instancetype)sharedInstance {
    static NetWorkService *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[NetWorkService alloc] init]; <--- init is unavailable
    });
    return sharedInstance;
}

@end

这是一个错误或我错过了什么?感谢。

1 个答案:

答案 0 :(得分:0)

您可以创建一个私有初始值设定项并从中调用Preferences > Gradle and ensure that the "Offline work",我认为Clang不应该抱怨此时[super init]的可用性。

-init

并且不要告诉任何人私有初始化程序存在并希望没有人知道。

当然,还有其他方法可以确保只存在一个类实例。

比如拥有某种Proxy并返回符合某种协议的私有隐藏类的共享实例。这样你可以隐藏某些工厂背后的对象实例化,你可以创建但无法用它做任何事情。

- (instancetype)init {
    @throw @"Use -sharedInstance.";
    return nil;
}

- (instancetype)privateInit {
   return [super init];
}

+ (instancetype)sharedInstance {
    static id sharedInstance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] privateInit];
    });
    return sharedInstance;
}