dispatch_once的用法

时间:2017-06-29 14:57:53

标签: ios objective-c

我理解dispatch_once等同于static变量,dispatch_once内的代码段在整个应用程序中只执行一次。

我正在经历一个巨大的代码库并遇到类似这样的事情

+ (DBHelper *)sharedInstance {

    static DBHelper *sharedDBHelper = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        sharedDBHelper = [[super alloc] initUniqueInstance];
    });

    return sharedDBHelper;
}

DBHelper.sharedInstance用于获取对象,并在很多地方用于生成对象。

我很困惑为什么在这里使用dispatch_once,因为这意味着你只能拥有该类的一个对象?

2 个答案:

答案 0 :(得分:1)

这是共享实例的标准模式,也称为 faux singleton

在许多情况下,程序员选择使用可以从应用程序的任何部分轻松访问的单个对象 - 通过调用返回对共享对象的引用的静态方法,即示例中的sharedInstance - 作为在应用程序的其他独立部分之间提供通信/共享数据的手段。

它是一个 faux 单例模式,因为它不会阻止创建相同类型的其他实例 - 在您的示例中为DBHelper true singleton 模型是一种只能创建该类型的单个实例的模型。 (Apple曾经有示例代码显示如何创建真正的单例,但它从未针对后ARC世界进行更新,有关更多详细信息,包括ARC版本,请参阅this answer。)

HTH

答案 1 :(得分:0)

这是一个单身人士(设计模式)。您只需要实例化一个类的一个实例,这就是您创建的所有实例。