iOS 创建单例的两个中模式
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
单例模式在iOS开发中非常创建,也非常重要。iOS中几个类就自带了单例模式,比如:NSApplication, NSFontManager, NSDocumentController,NSHelpManager, NSNull,NSProcessInfo, NSScriptExecutionContext, NSUserDefaults。
第一种方法:synchronize关键字
1、重写allocWithZone方法,代码如下:
//创建单例对象
static TFDataCache *dCache = nil;
/**
* 重写父类的方法
*/
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
//synchronized关键字,代表该方法加锁
@synchronized(self){
if (!dCache) {
dCache = [super allocWithZone:zone];
}
}
return dCache;
}
2、建立sharedXXX类方法,方便其他人访问。代码如下:
/**
* 创建单例
*/
+(TFDataCache *)sharedDataCache{
//synchronized关键字,代表该方法加锁
@synchronized(self){
if (!dCache) {
dCache = [[[TFDataCache class]alloc]init];
}
}
return dCache;
}
注:1、@synchronized,代表这个方法加锁, 相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程例如B正在用这个方法,有的话要等正在使用synchronized方法的线程B运行完这个方法后再运行此线程A,没有的话,直接运行。
第二种方法:dispatch_once(GCD)(iOS 4以后开始推出)
1、重写allocWithZone方法,代码如下:
//创建单例对象
static TFDataCache *dCache =nil;
+ (instancetype)allocWithZone:(struct_NSZone *)zone{
static dispatch_once_t onceToken;
//代码只执行一次
dispatch_once(&onceToken, ^{
dCache = [super allocWithZone:zone];
});
returndCache;
}
//创建单例对象
+(TFDataCache *)sharedDataCache{
return [self allocWithZone:nil];
}
注:dispatch_once 是线程安全的,能够做到在多线程的环境下Block中的代码只会被执行一次。总结——单例设计模式
优点:可以阻止其他对象实例化单例对象的副本,从而确保所有对象都访问唯一实例;
缺点:单例对象一旦建立,对象指针是保存在静态区的,单例对象在堆中分配的内存空间,会在应用程序终止后才会被释放;