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