單例模式
確保某一個類只有一個實例餐曹,而且自行實例化并向整個系統(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;
}
嚴(yán)格單例(官方)
盡管我們很少會使用到嚴(yán)格的單例模式驼鞭,但當(dāng)真的需要的時候,還是可以實現(xiàn)的尺碰。
蘋果官方文檔提供了一個嚴(yán)格單例的實現(xiàn)(傳送門)挣棕。 其重載了allocWithZone:, copyWithZone, retain, retainCount, release, autorelease。使得這個實現(xiàn)變得無比復(fù)雜而難以理解和控制亲桥。