我正在制作一个单身课程供我使用。我见过单例类的代码是这样的:
//First Example
+ (id)sharedManager {
static MyManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
//Second Example
static SingletonSample *sharedObject;
+ (SingletonSample*)sharedInstance {
if (sharedObject == nil) {
sharedObject = [[super allocWithZone:NULL] init];
}
return sharedObject;
}
这些秒似乎很好,也很容易理解。但我很困惑在第一个例子中,每次将sharedMyManager设置为nil并且每次都有一个共享管理器的分配,我怀疑的是第一个例子将如何返回类的相同引用(Singleton)。
感谢。
答案 0 :(得分:5)
首先,当在函数中声明static时,它只被声明一次。那么,行
static MyManager *sharedMyManager = nil;
第一次调用函数时只会执行一次。
在使用dispath_once
的下一行中,它只会被执行一次。因此sharedMyManager
的创建只会进行一次。所以,这是创造单吨课程的完美方式。
答案 1 :(得分:2)
因为static
它最初将被设置为nil
,但在后续调用中,该值将保留为之前调用中设置的值。
第一个例子更好,因为它是线程安全的。第二个例子甚至没有初始化sharedObject
这是危险的(我不相信有保证全局变量初始化为零)。
答案 2 :(得分:1)
sharedMyManager is set to nil each time
静态变量只设置一次。
there is a allocation of shared manager each time
您使用dispatch_once
,因此也不正确。
了解dispatch_once here。 使用GCD更快,线程安全。