单例(sharedInstance)在推荐的初始化之后为零

Singleton (sharedInstance) nil after recommended init

我一直在寻找有关如何创建在 ios 上线程安全的单例模式的解决方案。 我一遍又一遍地找到基本相同的解决方案,但是当我初始化对象时,指针仍然为空。从截图中可以看出。

这很奇怪,因为到目前为止互联网上似乎还没有人遇到过这个问题。我自己需要比较sharedInstance是否初始化为在其他地方输入某段代码并且它总是在init之后告诉我它是nil。

这是关于什么的? 有人有任何线索吗? 我想明白! :D

提前致谢, 干杯, 雷神

// 为什么这不是重复的:// 这个问题不是关于正确的初始化,而是关于为什么 sharedInstance 之后的行为不像它应该的那样。我仍然遇到无法将其与 nil 进行比较的问题,甚至无法在 sharedInstance 方法中进行比较以防止覆盖单例。如何防止覆盖将是我的后续问题?我什至用另一个 BOOL 尝试过它,我在初始化期间将其设置为 true。结果是,if (!bool) 将被视为 true,尽管我的调试器说 bool==yes-> !bool 应该是 false。

问题: 为什么我指向实例的指针 return 正确并且外部(在调用方方法端)结果为零? 弄清楚从外面打来的电话:

ControlSchemes *cs = [ControlSchemes sharedInstance];

将输入 sharedInstance 的代码,根据调试器,在 return 中有一个指向有效对象的有效指针,但在 [=31] 中将有 nil =]cs 跨过之后。为什么?

//

你应该这样创建你的单例。

+ (instancetype)sharedInstance
{
    static dispatch_once_t once;
    static id sharedInstance;
    dispatch_once(&once, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

除了显示创建单例的推荐方法的 Jaeger's answer 之外,以下是您完全失败的原因:

您正在调用 [super allocWithZone]。您在 class 方法中调用它。在 class 方法中,self 是一个 class。不是实例,而是 class。因此,super 不是 class 的 superclass(就像 ControlSchemes 的 superclass),而是 Class 的 superclass。但是Class没有superclass。超级class 是零。因此,您将 allocWithZone 发送给 nil,然后返回 nil。

即使你为 ControlSchemes 的 superclass 调用了 alloc,那显然是无稽之谈,因为你想要的不是 superclass 的实例,而是 ControlSchemes 的实例。

好的,在我使用 Jaegers 帮助进行调整后,我发现我使用了第二个变量,如第一个屏幕截图所示。

所以我假设:

gnasher729 回答了我第一次实施的问题(-> 参见屏幕截图 2)。

从 Jaeger 进行调整的第二个实现的问题(-> 参见屏幕截图 1)是 sharedInstance 的简单双重初始化(超出 return 的 ifs 范围)

谢谢大家