正确的单例实现
Proper Singleton Implementation
我正在通读一本书,试图清除 Objective-C 的灰尘,我在阅读如何实现单例时 运行 进入了这个问题。这是他们在书中的实现:
+ (ClassName *)sharedClass {
static ClassName *sharedClass = nil;
if (!sharedClass) {
sharedClass = [[super allocWithZone:nil] init];
return shared store
}
我的问题是,为什么每次方法 运行 时他们都将其设置为 nil,然后检查它是否为 nil(现在显然是 nil)并创建一个新实例?这听起来好像违背了单身人士的全部目的,只有一个 class 实例。我注意到有很多与单例实现相关的问题,但 none 具体到它的这方面。相信我,发帖前我已经梳理过了。
静态变量第一次设置为nil。一旦 sharedClass
实例被实例化,每当您调用 [ClassName sharedClass]
.
时,您将始终拥有相同的实例
你应该使用线程安全模式来使用单例模式。
+ (instancetype)shared {
static id shared = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shared = [[self alloc] init];
});
return sharedInstance;
}
这将防止可能的崩溃。
我正在通读一本书,试图清除 Objective-C 的灰尘,我在阅读如何实现单例时 运行 进入了这个问题。这是他们在书中的实现:
+ (ClassName *)sharedClass {
static ClassName *sharedClass = nil;
if (!sharedClass) {
sharedClass = [[super allocWithZone:nil] init];
return shared store
}
我的问题是,为什么每次方法 运行 时他们都将其设置为 nil,然后检查它是否为 nil(现在显然是 nil)并创建一个新实例?这听起来好像违背了单身人士的全部目的,只有一个 class 实例。我注意到有很多与单例实现相关的问题,但 none 具体到它的这方面。相信我,发帖前我已经梳理过了。
静态变量第一次设置为nil。一旦 sharedClass
实例被实例化,每当您调用 [ClassName sharedClass]
.
你应该使用线程安全模式来使用单例模式。
+ (instancetype)shared {
static id shared = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shared = [[self alloc] init];
});
return sharedInstance;
}
这将防止可能的崩溃。