【发布时间】:2013-01-07 08:17:00
【问题描述】:
为了利用全局变量和方法,我将 Singleton 实现为一种健康的编码实践。在实施之前,我关注了Apple documents、john wordsworth blog。首先,我没有使我的单例线程安全,我实现了这个方法以及博客和 Apple 文档中提到的所有其他方法。
+ (SingletonClass *)sharedManager
{
static SingletonClass *sharedManager = nil;
if (sharedManager == nil) {
sharedManager = [[super allocWithZone:NULL] init];
}
return sharedManager;
}
之后,为了使 Singleton 线程安全,我像这样对 + (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;
}
如果我删除这个线程安全代码 sn-p 并恢复到以前的代码,它可以正常工作并且代码被执行。
请注意,我还查看了bbum's answer here,其中他在提问之前提到了可能的死锁情况,但我无法弄清楚问题所在。任何解释或解决方案都会对我有所帮助。谢谢。
编辑 1:
如果有人想查看完整的代码,我为此创建了gist。请跟随那里。谢谢。
【问题讨论】:
标签: iphone objective-c ios singleton