Matt Galloway表明这是初始化单身人士的正确方法:
+ (id)sharedManager {
static MyManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
我已经过测试,但它的工作正常,但我不明白为什么。首次创建单例时,变量sharedMyManager
设置为init行的内容,但是当单例已经创建并且我使用[MySingleton sharedManager];
访问它时,代码的第一行运行,设置{{ 1}}到sharedMyManager
然后最后一行运行返回理论上的nil
。事实上,它正在返回正确的单身人士,但为什么呢?
如果nil
设置为sharedMyManager
,nil
如何返回正确的对象?
注意,因为在创建单身人士之后,我正在谈论对sharedManager
的后续调用。
我认为静态关键字现在正在进行魔术,现在允许将值分配多次,但如果这是真的,则init部分不起作用,因为静态变量首先被赋值为nil
请在我五岁的时候解释一下。谢谢。
答案 0 :(得分:5)
sharedMyManager
是一个静态变量,因此根据定义,它的初始化程序只运行一次。第一次(仅)输入块时,它被设置为nil
。然后dispatch_once
块运行并分配它,然后返回sharedMyManager
。
对于所有后续调用,nil
的初始化不会发生,dispatch_once()
内容也不会被重新执行,所以所有发生的情况都是返回初始化变量
答案 1 :(得分:0)
dispatch_once()将该类实例化一次。
因此,在调用sharedManager()一次之后,单例已经存在并重新使用。