實現單例模型須要作的三件事: 1.使用全局靜態變量記錄一個被實例化的對象多線程
2.重寫allowWithZone方法,並使用dispath_once_t,從而保證在 多線程的狀況下,也能實例化一個對象性能
static dispath_once_t onceToken; dispatch_once(&onceToken, ^{atom
SharedInstance = [super allocWithZone:zone];spa
});線程
3.創建以shared開頭的類方法實例化單例對象,便於其餘類調用, 同時不容易引發歧義一樣使用dispath_once_t確保只有一個副本被創建對象
關於被搶奪資源使用的注意事項內存
在多線程應用中,全部被搶奪資源的屬性須要設置爲原子屬性資源
系統會在多線程搶奪時,保證該屬性有且僅有一個線程可以訪問開發
注意:使用atomic屬性,會下降系統性能,在開發多線程應用時,儘可能不要使用同步
另外,atomic屬性,必須與@synchronized(同步鎖)一塊兒使用
把Ticket設置爲單例
.h
+(Ticket *)shareTicket;
@property(assign, atomic) NSInter tickets;
.m
static Ticket *SharedInstance
// 使用內存地址實例化對象,全部實例化方法,最終都會調用此方法
// 要實例化出來惟一的對象,須要一個變量記錄住第一個實例化出來的對象
+ (id)allocWithZone:(NSZone *)zone {
// 解決多線程中,一樣只能實例化出一個對象副本
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SharedInstance = [super allocWithZone:zone];
});
return SharedInstance;
}
// 創建一個單例對象,便於其餘類調用
+ (Ticket *)sharedTicket {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SharedInstance = [[Ticket alloc]init];
});
return SharedInstance;
}