有不同类型的单例实现。

第一:

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类的静态变量没有什么不同。您可以同时使用两种方式。
第三种方式:您可以在我解释第二种方式之后理解。当shaedInstancePKShareClass类的静态变量时,这种方式与第二种方式相同。但是您无需检查!_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/

10-12 14:46