單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。意思只有一個實例。
錯誤寫法(非線程安全)
#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 只是保證只有同一時間只有一個操作對當(dāng)前 self的操作。
GCD(推薦)
+(DataSource *)shareDataSource {
static DataSource *dataSource = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dataSource = [DataSource new];
});
return dataSource;
}
dispatch_once中代碼只執(zhí)行一次,它是同步方法,比 @synchronized快許多
普通寫法
#import "DataSource.h"
static DataSource *dataSource;
@implementation DataSource
+ (DataSource *)shareDataSource {
if (!dataSource) {
dataSource = [[DataSource allocWithZone:NULL] init];
}
return dataSource;
}
嚴格單例(官方)
盡管我們很少會使用到嚴格的單例模式,但當(dāng)真的需要的時候,還是可以實現(xiàn)的。
蘋果官方文檔提供了一個嚴格單例的實現(xiàn)(傳送門)。 其重載了allocWithZone:, copyWithZone, retain, retainCount, release, autorelease。使得這個實現(xiàn)變得無比復(fù)雜而難以理解和控制。