为了使用全局变量和方法,我实现了Singleton作为健康的编码实践。在执行之前,我遵循了Apple documents,john wordsworth blog。首先,我没有让我的单例线程安全,我实现了这个方法以及博客和Apple文档中提到的所有其他方法。使用线程安全的代码执行停止单例初始化代码
+ (SingletonClass *)sharedManager
{
static SingletonClass *sharedManager = nil;
if (sharedManager == nil) {
sharedManager = [[super allocWithZone:NULL] init];
}
return sharedManager;
}
之后,为了使辛格尔顿线程安全我犯了这样的变化+ (SingletonClass *)sharedManager
类和我的应用程序停止发射。我把断点,并观察dispatch_once
被调用两次,然后代码停止执行进一步。
+(SingletonClass *)sharedManager
{
static SingletonClass *sharedManager = nil;
if (sharedManager !=nil)
{
return sharedManager;
}
static dispatch_once_t pred;
dispatch_once(&pred, ^{
sharedManager = [SingletonClass alloc];
sharedManager=[sharedManager init];
});
return sharedManager;
}
如果我删除这个线程安全代码片段并恢复到以前的代码它工作正常,代码得到执行。
请注意,我还查看了bbum's answer here,他提到问题之前提到了可能的死锁情况,但我无法弄清楚问题所在。任何解释或解决方案都会对我有所帮助。谢谢。
编辑1:
如果有人想看看完整的代码,我创建gist了点。请跟着那里。谢谢。
感谢您的代码的详细解释..我写了'sharedManager = [[SingletonClass alloc] init];'在第一个然后只分成两行,每个bbum回答我已经提到过,你是正确的问题是在别的地方,如果有人想看完整的代码,也发布了完整代码的链接 –
+1 from me对于很好的解释,帮助我 –
我已经更新了我的答案 –