Singleton类静态变量每次设置为nil

时间:2014-06-23 06:53:28

标签: ios objective-c grand-central-dispatch shared

我正在制作一个单身课程供我使用。我见过单例类的代码是这样的:

//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)。

感谢。

3 个答案:

答案 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更快,线程安全。