本文介绍了如何正确实现ARC兼容和`alloc init`安全的Singleton类?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我看到了线程安全版本
+(MyClass *)singleton {
static dispatch_once_t pred;
static MyClass *shared = nil;
dispatch_once(&pred, ^{
shared = [[MyClass alloc] init];
});
return shared;
}
但如果有人只是打电话给会发生什么?[MyClass alloc] init]
?如何让它返回与 +(MyClass *)单例
方法相同的实例?
but what would happen if someone just calls [MyClass alloc] init]
? How to make it return same instance as the +(MyClass *)singleton
method?
推荐答案
Apple推荐使用严格的单例实现(不允许使用相同类型的其他生物对象):
Apple recommends the strict singleton implementation (no other living object of the same type is allowed) this way:
+ (instancetype)singleton {
static id singletonInstance = nil;
if (!singletonInstance) {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
singletonInstance = [[super allocWithZone:NULL] init];
});
}
return singletonInstance;
}
+ (id)allocWithZone:(NSZone *)zone {
return [self singleton];
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
链接到苹果文档(页面底部,没有ARC)
这篇关于如何正确实现ARC兼容和`alloc init`安全的Singleton类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!