所以我正在编写一个单例对象,并希望将init方法标记为NS_UNAVAILABLE
或
__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
这是一个错误或我错过了什么?感谢。
答案 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;
}