伪单例顾名思义就是创建单例的时候有可能不能保障唯一的实例,原因是别人可能并不知道你是单例,在生成的时候用[[class alloc] init]的形式,allocWithZone能保证不管哪种形式都能确保是单例。
一般我们习惯在定义方法share中使用dispatch_once函数(这个函数的作用就是保证block)来保证单例模式在整个程序中只被创建一次。但是之前看到有个同学是覆写+(instancetype)allocWithZone:(struct _NSZone *)zone方法中添加代码,保证只被创建一次。
单例的使用场景概括如下:
控制资源的使用,通过线程同步来控制资源的并发访问。
控制实例的产生,以达到节约资源的目的。
控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。
+(instancetype)sharedInstance
{
staticdispatch_once_tonceToken;
dispatch_once(&onceToken,^{
_sharedInstance =[[super allocWithZone:NULL]init];
});
return_sharedInstance;
}
+(id)allocWithZone:(struct_NSZone *)zone
{
return[TestOyqNSObject sharedInstance];
}
+(instancetype)alloc
{
return[TestOyqNSObject sharedInstance];
}
-(id)copy
{
returnself;
}
-(id)mutableCopy
{
returnself;
}
-(id)copyWithZone:(struct_NSZone *)zone
{
returnself;
}