我理解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,因为这意味着你只能拥有该类的一个对象?
答案 0 :(得分:1)
这是共享实例的标准模式,也称为 faux singleton 。
在许多情况下,程序员选择使用可以从应用程序的任何部分轻松访问的单个对象 - 通过调用返回对共享对象的引用的静态方法,即示例中的sharedInstance
- 作为在应用程序的其他独立部分之间提供通信/共享数据的手段。
它是一个 faux 单例模式,因为它不会阻止创建相同类型的其他实例 - 在您的示例中为DBHelper
。 true singleton 模型是一种只能创建该类型的单个实例的模型。 (Apple曾经有示例代码显示如何创建真正的单例,但它从未针对后ARC世界进行更新,有关更多详细信息,包括ARC版本,请参阅this answer。)
HTH
答案 1 :(得分:0)
这是一个单身人士(设计模式)。您只需要实例化一个类的一个实例,这就是您创建的所有实例。