我有一个我希望以Singleton的形式实现的类。
我希望通过以下方式创建/访问此类实例的唯一方法是:
+(MYClass*)sharedInstance
方法。在方法实现中(当然)调用alloc和init。
有没有办法阻止使用alloc和init,或者让它们“空”,如果尝试通过sharedInstance方法创建该类的实例(但是直接通过alloc + init)? / p>
答案 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;
}