gpt4 book ai didi

ios - 单例设计模式以及不同类型之间的区别?

转载 作者:行者123 更新时间:2023-11-29 00:08:54 25 4
gpt4 key购买 nike

有不同类型的单例实现。

首先:

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;
}

我的问题是当我们像 first 和 second 这样初始化时意味着什么??第三个是 NSOperationQueue。我们像第三个一样初始化有什么用?很难找到意义。

最佳答案

恐怕我无法给您一个可以清楚解释这三种方式的链接,但我会告诉您我的理解。

  • 第一种方法:您创建实例是 MyGlobalClass 类的静态变量。在 myinstance 方法中,您检查 instance 是否已初始化。如果不是,则初始化实例。毕竟,返回实例的值。因为 instance 是 MyGlobalClass 的静态变量,所以当您调用 [MyGlobalClass myinstance] 时,它始终是一个对象。
  • 第二种方式:您创建shaedInstance是方法sharedInstance的静态变量。当你调用dispatch_once(&onceToken时,block里面的代码只调用了一次。关于dispatch_once,你可以看看here。因为初始化方法只调用了一次有一次,返回时 shaedInstance 总是一个对象。实际上,如果 shaedInstance 是 PKShareClass 类的静态变量,也没有什么不同。两种方式都可以使用。
  • 第三种方式:在我解释第二种方式后你就可以理解了。当shaedInstancePKShareClass类的静态变量时,这种方式与第二种方式相同。但您不需要检查 dispatch_once 内的 !_connectionQueue。因为它只运行一次,而且第一次总是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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com