我了解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感到困惑,因为那将意味着您只能有该类的一个对象?
最佳答案
这是共享实例的标准模式,也称为人造单例。
在许多情况下,程序员选择使用单个对象,该对象可以从应用程序的任何部分轻松访问-通过调用静态方法,该方法返回对共享库的引用,即您的示例中的sharedInstance
-作为提供应用程序原本独立的部分之间的通信/共享数据。
这是一种伪单例模式,因为它不会阻止创建其他相同类型的实例(在您的示例中为DBHelper
)。真正的单例模型是其中只能创建该类型的单个实例的模型。 (Apple以前有显示如何创建真正单例的示例代码,但从未在ARC后世界进行过更新,有关包括ARC版本在内的更多信息,请参见this answer。)
高温超导
关于ios - dispatch_once的用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44828652/