我一直在寻找有关如何在ios上创建线程安全的单例模式的解决方案。 我一遍又一遍地遇到相同的解决方案,但是当我初始化对象时,指针仍然显示为null。你可以从截图中看出来。
这很奇怪,因为到目前为止,互联网上似乎没有人遇到这个问题。我自己需要比较是否初始化了sharedInstance以在其他地方输入某段代码,它会在init之后告诉我它是零。
这是关于什么的? 有人有任何线索吗? 我想明白! :d
提前致谢, 干杯, 托尔
//为什么这不重复:// 这个问题不是关于正确的init,而是关于为什么sharedInstance不像以后那样表现的原因。我仍然遇到无法将其与nil进行比较甚至在sharedInstance方法中进行比较以防止覆盖单例的问题。如何防止覆盖将是我的后续问题?我甚至尝试了另一个BOOL,我在init期间设置为true。结果是,if(!bool)将被视为true虽然我的调试器说bool == yes-> !bool应该是假的。
问题: 为什么我的指向实例的指针正确返回并且在外部(在调用方法方面)结果为nil? 要明确来自外部的电话:
ControlSchemes *cs = [ControlSchemes sharedInstance];
将输入 sharedInstance 的代码,根据调试器在返回中有一个指向有效对象的有效指针,然后在步进后将 cs 中的nil置为nil。为什么呢?
//
答案 0 :(得分:3)
你应该以这种方式创造你的单身。
+ (instancetype)sharedInstance
{
static dispatch_once_t once;
static id sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
答案 1 :(得分:1)
除了Jaeger的答案,其中显示了创建单身人士的推荐方法,以下是您完全失败的原因:
您正在调用[super allocWithZone]。你是在一个类方法中调用它。在类方法中,self是一个类。不是一个实例,而是一个类。因此,super不是类的超类(如ControlSchemes的超类),而是Class的超类。但是Class没有超类。它的超类是Nil。所以你将allocWithZone发送到nil,然后返回nil。
即使您为ControlSchemes的超类调用了alloc,这显然是无稽之谈,因为您不需要超类的实例,而是ControlSchemes的实例。