鉴于这两种创建单例的方法,第一种是线程安全的,第二种不是线程安全的,我想知道,每次调用它们时,“共享实例”都不会设置为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;
}
感谢您的提前帮助
答案 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#等