理解单例和静态变量

时间:2015-07-31 18:01:36

标签: ios objective-c multithreading

鉴于这两种创建单例的方法,第一种是线程安全的,第二种不是线程安全的,我想知道,每次调用它们时,“共享实例”都不会设置为nil 。我知道不是,但我想知道为什么。我认为这与static关键字有关,但我想要更深入的理解。

线程安全实例

+ (instancetype)sharedInstance {
  static id _sharedInstance = nil; //why isn't it set to nil every time
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
      _sharedInstance = [[self alloc] init];
  });

  return _sharedInstance;
}

非线程安全实例

+ (instancetype)sharedManager    
{
    static PhotoManager *sharedPhotoManager = nil; //why isn't set to nil every time
    if (!sharedPhotoManager) {
        sharedPhotoManager = [[PhotoManager alloc] init];
        sharedPhotoManager->_photosArray = [NSMutableArray array];
    }
    return sharedPhotoManager;
}

感谢您的提前帮助

2 个答案:

答案 0 :(得分:2)

这是基本的C.如果您学习Objective-C,您应该学习C书并学习有关该语言的基础知识。

静态变量,如全局变量,从程序开始到程序结束只存在一次,并在第一次访问变量之前的某个时间初始化一次。这是过去40年左右的基本C规则,也适用于Objective-C,因为它是C的超集。

您看到的是初始化,而不是分配

答案 1 :(得分:1)

static关键字扩展了程序终止的变量util的生命周期,即使只在本地有效。它还确保它只会被初始化一次。

void scope()
{
  // Without `static`, var1 would be reset to 0 in every call
  static TYPE var1 = 0; // Instantiated and initialized only once.
  useVar(var1); // Use the variable and possibly change its value
  // Even though var1 is only valid in the scope, it retains the last value 
} 

它与其他语言具有相同的行为,例如C / C ++,Java,C#等