单例(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 范围)
谢谢大家
我一直在寻找有关如何创建在 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 范围)
谢谢大家