Singleton(sharedInstance)无推荐初始化后

问题描述:

我一直在寻找解决方案,如何创建一个单线程模式是线程安全的IOS。 我一遍又一遍地找到了相同的解决方案,但是当我初始化对象时指针仍然为空。正如你从截图中可以看出的那样。Singleton(sharedInstance)无推荐初始化后

这很奇怪,因为互联网上没有人似乎有这个问题到目前为止。我自己需要比较一下,如果sharedInstance被初始化为在其他地方输入某段代码,它会在初始化后告诉我它为零。

这是怎么回事?任何人都有线索吗? 我想了解! :d

由于提前, 欢呼声, 雷神

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

问题:为什么我的指针实例正确地返回并在外部(在调用方方)结果为零? 要清楚从外面打电话:

ControlSchemes *cs = [ControlSchemes sharedInstance]; 

将根据调试器进入sharedInstance的代码有一个有效的指针在返回一个有效的对象,但届时将有CS里面零加入后。为什么?

//

enter image description here

除积的答案,给出了推荐的方法来创建一个单身,这里就是为什么你有一个完整的故障:

要调用[超级allocWithZone。你正在用类方法调用它。在类方法中,self是一个类。不是一个实例,而是一个类。因此super不是你的类的超类(比如ControlSchemes的超类),而是Class的超类。但班级没有超班。它的超类是零。所以你把allocWithZone发送到零,然后返回零。

即使你叫页头为ControlSchemes的超类,这将是明显的废话,因为你不想要的父类的实例,但ControlSchemes的一个实例。

+0

谢谢.. 。这是一个很好的提示......但正如Jaegers看到的那样(第一个屏幕截图[self alloc]),我仍然可以得到指向return语句的指针,但在调用方法中返回的指针为零。这方面的任何线索? – Thor

您应该创建单身这种方式。

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

好了在我用Jaegers做出的调整后,我发现我在第一个屏幕截图中看到了第二个变量。

所以我认为:

我的第一个执行问题( - >见截图2)由gnasher729回答。

与第二的实施与调整从积问题( - >见截图1)是sharedInstance的简单双初始化(出退回IFS范围)

谢谢你们