如果您可以定位iOS 4.0或更高版本
使用GCD,它是在Objective C(线程安全)中创建单例的最佳方法吗?
+ (instancetype)sharedInstance
{
static dispatch_once_t once;
static id sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
Run Code Online (Sandbox Code Playgroud) 我为什么陷入困境?
- (void)foo
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[self foo];
});
// whatever...
}
Run Code Online (Sandbox Code Playgroud)
我希望foo在第一次通话时执行两次.
为了利用全局变量和方法,我将Singleton实现为一种健康的编码实践.在实施之前我跟着Apple文档,john wordsworth博客.首先,我没有使我的单例线程安全,我实现了这个方法以及博客和Apple文档中提到的所有其他方法.
+ (SingletonClass *)sharedManager
{
static SingletonClass *sharedManager = nil;
if (sharedManager == nil) {
sharedManager = [[super allocWithZone:NULL] init];
}
return sharedManager;
}
Run Code Online (Sandbox Code Playgroud)
之后,为了使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;
}
Run Code Online (Sandbox Code Playgroud)
如果我删除此线程安全代码片段并恢复到以前的代码,它工作正常,代码执行.
请注意,我也在这里查看了bbum的答案,他在提问之前提到了可能的死锁情况,但我无法弄清楚问题.任何解释或解决方案对我都有帮助.谢谢.
编辑1:
如果有人想要查看完整的代码,我已经为此创建了要点.请跟着那里.谢谢.