有不同类型的单例实现。
首先:
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。当我们像第三个一样初始化时有什么用? 很难找到意义。
答案 0 :(得分:1)
我担心我不能给你一个可以清楚解释这三种方式的链接,但我会告诉你我的理解。
myinstance
方法中,您可以检查instance
是否已初始化。如果没有,请初始化instance
。毕竟,返回instance
的值。因为instance
是MyGlobalClass的静态变量,所以当你调用[MyGlobalClass myinstance]
时,它总是一个对象。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种方法;)