IOS單例

實現單例模型須要作的三件事: 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;

}

相關文章
相關標籤/搜索