相关疑难解决方法(0)

在Objective C中使用GCD的dispatch_once创建单例

如果您可以定位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)

singleton objective-c grand-central-dispatch ios

341
推荐指数
5
解决办法
9万
查看次数

为什么我用dispatch_once搞死了?

我为什么陷入困境?

- (void)foo
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        [self foo];

    });

    // whatever...
}
Run Code Online (Sandbox Code Playgroud)

我希望foo在第一次通话时执行两次.

macos semaphore objective-c grand-central-dispatch ios

7
推荐指数
1
解决办法
2872
查看次数

使用线程安全的Singleton初始化代码停止代码执行

为了利用全局变量和方法,我将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:

如果有人想要查看完整的代码,我已经为此创建了要点.请跟着那里.谢谢.

iphone singleton objective-c ios

2
推荐指数
1
解决办法
773
查看次数