有不同类型的单例实现。
第一:
static MyGlobalClass *instance = nil;
+(MyGlobalClass*)myinstance
{
@synchronized(self)
{
if(instance==nil)
{
instance= [MyGlobalClass new];
}
}
return instance;
}
第二:
+(PKShareClass *)sharedInstance
{
static PKShareClass *shaedInstance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shaedInstance = [[PKShareClass alloc]init];
});
return shaedInstance;}
最后是
static NSOperationQueue * _connectionQueue = nil;
+ (NSOperationQueue *) connectionQueue{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (!_connectionQueue)
{
_connectionQueue = [[NSOperationQueue alloc] init];
}
});
return _connectionQueue;
}
在这里,我的问题是,当我们像第一个和第二个一样初始化时,这意味着什么?
第三个是NSOperationQueue。当我们像第三个那样初始化时,有什么用?
很难找到含义。
最佳答案
恐怕我无法给您提供可以清楚说明这两种方式的链接,但我会告诉您我的理解。
第一种方式:创建实例是MyGlobalClass类的静态变量。在myinstance
方法中,检查instance
是否已初始化。如果不是,请初始化instance
。毕竟,返回值instance
。因为instance
是MyGlobalClass的静态变量,所以当您调用[MyGlobalClass myinstance]
时,它始终是一个对象。
第二种方法:创建shaedInstance是sharedInstance方法的静态变量。调用dispatch_once(&onceToken
时,块中的代码仅被调用一次。关于dispatch_once
,您可以看一下here。由于初始化方法仅被调用一次,因此shaedInstance
在返回它时始终是一个对象。实际上,shaedInstance是PKShareClass
类的静态变量没有什么不同。您可以同时使用两种方式。
第三种方式:您可以在我解释第二种方式之后理解。当shaedInstance
是PKShareClass
类的静态变量时,这种方式与第二种方式相同。但是您无需检查!_connectionQueue
中的dispatch_once
。因为它只运行一次,所以总的来说总是在第一次nil
。这种方式可以像这样重构:
static NSOperationQueue * _connectionQueue = nil;
+ (NSOperationQueue *) connectionQueue{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (!_connectionQueue)
_connectionQueue = [[NSOperationQueue alloc] init];
});
return _connectionQueue;
}
希望我的回答可以帮助您更轻松地理解3种方法;)
关于ios - 单例设计模式和不同类型之间的差异?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47175544/