gpt4 book ai didi

ios - 为什么这段代码有效?

转载 作者:可可西里 更新时间:2023-11-01 04:39:13 25 4
gpt4 key购买 nike

Matt Galloway建议这是初始化单例的正确方法:

+ (id)sharedManager {
static MyManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}

我已经测试过它可以正常工作,但我不明白为什么。当第一次创建单例时,变量 sharedMyManager 设置为初始化行的内容,但是当单例已经创建并且我使用 [MySingleton sharedManager]; 访问它时第一行代码运行,将 sharedMyManager 设置为 nil,然后最后一行运行返回理论上的 nil。事实上,它返回了正确的单例,但为什么呢?

如果 sharedMyManager 被设置为 nil,它如何返回正确的对象?

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

我想 static 关键字现在正在发挥作用,允许多次分配值,但如果这是真的,则 init 部分应该不起作用,因为静态变量首先被分配给 nil .

请解释一下我才五岁。谢谢。

最佳答案

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

对于所有后续调用,nil 的初始化不会发生dispatch_once() 内容也不会重新执行,因此所有有效发生的是初始化变量的返回。

关于ios - 为什么这段代码有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21106383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com