我正在阅读一本试图刷掉Objective-C上的灰尘的书,我在阅读如何实现单例时遇到了这个问题。这是他们在书中所具有的实现:
+ (ClassName *)sharedClass {
static ClassName *sharedClass = nil;
if (!sharedClass) {
sharedClass = [[super allocWithZone:nil] init];
return shared store
}
我的问题是,为什么每次运行该方法时都会将其设置为nil,然后检查它是否为零,现在显然是,并创建一个新实例?这听起来像是破坏了单身人士的整个目的,只有一个班级的一个实例。我注意到了很多与单例实现有关的问题,但没有一个与这方面有关。相信我,在发布之前我已经梳理过了。
答案 0 :(得分:1)
静态变量仅在第一次设置为nil。实例化sharedClass
实例后,每当您调用[ClassName sharedClass]
时,您都将拥有相同的实例。
您应该使用线程安全模式来使用单例模式。
+ (instancetype)shared {
static id shared = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shared = [[self alloc] init];
});
return sharedInstance;
}
这可以防止可能发生的崩溃。