我对如何在objective-c中实现单例感到困惑。
我读了这篇关于stackoverflow的文章,并被显示为正确答案的代码所迷惑。
如何实现与ARC兼容的Objective-C单例?
这段代码来自上面的帖子链接。
+ (MyClass *)sharedInstance
{
static MyClass *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[MyClass alloc] init];
// Do any other initialisation stuff here
});
return sharedInstance;
}
我不明白的是下面这一行。
static MyClass *sharedInstance = nil;
为什么它需要分配"nil"静态变量的方法?如果这一行位于sharedInstance方法的顶部,则每次调用它时,静态变量变为nil。而且因为"despatch_once"只被调用一次,我认为这个方法总是在这个方法被调用一次后返回nil。
谁能帮我理解这个东西是怎么工作的?
该方法的第一行在第二次调用后也被忽略吗?
任何类中的静态变量只能创建一次,并且在同一类的所有实例之间共享
但是静态变量还有另一种用法,那就是在函数中使用静态变量,这就是您的例子。函数内部的静态变量是在后续调用中保留其值的变量。- (int)addOne
{
static int i;
i++;
return i;
}
在这里,即使i
是一个局部变量,i
也会保留之前调用时的值。但是如何初始化这样一个变量呢?你可以这样做
static int i=10;
初始化只在函数第一次调用时执行,在以后的调用中跳过。