为什么这段代码有效?

时间:2014-01-14 04:59:36

标签: ios objective-c cocoa-touch singleton

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设置为sharedMyManagernil如何返回正确的对象?

注意,因为在创建单身人士之后,我正在谈论对sharedManager的后续调用。

我认为静态关键字现在正在进行魔术,现在允许将值分配多次,但如果这是真的,则init部分不起作用,因为静态变量首先被赋值为nil

请在我五岁的时候解释一下。谢谢。

2 个答案:

答案 0 :(得分:5)

sharedMyManager是一个静态变量,因此根据定义,它的初始化程序只运行一次。第一次(仅)输入块时,它被设置为nil。然后dispatch_once块运行并分配它,然后返回sharedMyManager

对于所有后续调用,nil 的初始化不会发生dispatch_once()内容也不会被重新执行,所以所有发生的情况都是返回初始化变量

答案 1 :(得分:0)

dispatch_once()将该类实例化一次。

因此,在调用sharedManager()一次之后,单例已经存在并重新使用。