为什么Apple推荐使用dispatch_once来实现ARC下的单例模式?

2023-11-26

在ARC下单例的共享实例访问器中使用dispatch_once的确切原因是什么?

+ (MyClass *)sharedInstance
{
    //  Static local predicate must be initialized to 0
    static MyClass *sharedInstance = nil;
    static dispatch_once_t onceToken = 0;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[MyClass alloc] init];
        // Do any other initialisation stuff here
    });
    return sharedInstance;
}

在后台异步实例化单例不是一个坏主意吗?我的意思是,如果我请求该共享实例并立即依赖它,但dispatch_once要等到圣诞节才能创建我的对象,会发生什么?它不会立即返回,对吧?至少这似乎是 Grand Central Dispatch 的全部意义所在。

那么他们为什么要这样做呢?


dispatch_once()是绝对同步的。并非所有 GCD 方法都是异步执行操作的(举个例子,dispatch_sync()是同步的)。指某东西的用途dispatch_once()替换以下习语:

+ (MyClass *)sharedInstance {
    static MyClass *sharedInstance = nil;
    @synchronized(self) {
        if (sharedInstance == nil) {
            sharedInstance = [[MyClass alloc] init];
        }
    }
    return sharedInstance;
}

的好处是dispatch_once()最重要的是它更快。它在语义上也更清晰,因为它还可以保护您免受多个线程对您的共享实例进行分配初始化的影响——如果它们都在同一时间尝试的话。它不允许创建两个实例。整个想法dispatch_once()是“执行一次且仅一次”,这正是我们正在做的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么Apple推荐使用dispatch_once来实现ARC下的单例模式? 的相关文章

随机推荐