iOS 单例模式的写法
2016-04-04 本文已影响144人
高压锅炖熊
单例模式
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。意思只有一个实例。
错误写法(非线程安全)
#import "DataSource.h"
@implementation DataSource
+ (DataSource *)shareDataSource {
static DataSource *dataSource;
if (dataSource == nil) {
dataSource = [[DataSource alloc] init];
}
return dataSource;
}
正确写法
#import "DataSource.h"
@implementation DataSource
+ (DataSource *)shareDataSource {
static DataSource *dataSource;
@synchronized(self){
if (dataSource == nil) {
dataSource = [[DataSource alloc] init];
}
}
return dataSource;
}
synchronized 只是保证只有同一时间只有一个操作对当前 self的操作。
GCD(推荐)
+(DataSource *)shareDataSource {
static DataSource *dataSource = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dataSource = [DataSource new];
});
return dataSource;
}
dispatch_once中代码只执行一次,它是同步方法,比 @synchronized快许多
普通写法
#import "DataSource.h"
static DataSource *dataSource;
@implementation DataSource
+ (DataSource *)shareDataSource {
if (!dataSource) {
dataSource = [[DataSource allocWithZone:NULL] init];
}
return dataSource;
}
严格单例(官方)
尽管我们很少会使用到严格的单例模式,但当真的需要的时候,还是可以实现的。
苹果官方文档提供了一个严格单例的实现(传送门)。 其重载了allocWithZone:, copyWithZone, retain, retainCount, release, autorelease。使得这个实现变得无比复杂而难以理解和控制。