为了利用全局变量和方法,我将 Singleton 实现为一种健康的编码实践。在实施之前,我关注了 Apple 文档,john wordsworth 博客。首先,我没有使我的单例线程安全,我实现了这个方法以及博客和 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 的答案,他在提问之前提到了可能的僵局情况,但我无法弄清楚这个问题。任何解释或解决方案都会对我有所帮助。谢谢。
编辑1:
如果有人想查看完整的代码,我已经为此创建了要点。请跟随那里。谢谢。