這個是從視頻中看來的,現在記錄在這裏
#import <Foundation/Foundation.h>
@interface Ticket : NSObject
// 實例化票據的單例
+ (Ticket *)sharedTicket;
// 在多線程應用中,所有被搶奪資源的屬性需要設置爲原子屬性
// 系統會在多線程搶奪時,保證該屬性有且僅有一個線程能夠訪問
// 注意:使用atomic屬性,會降低系統性能,在開發多線程應用時,儘量不要資源
// 另外,atomic屬性,必須與@synchronized(同步鎖)一起使用
// 票數
@property (assign, atomic) NSInteger tickets;
@end
#import "Ticket.h"
static Ticket *SharedInstance;
@implementation Ticket
/**
實現單例模型需要做三件事情
1. 使用全局靜態變量記錄住第一個被實例化的對象
static Ticket *SharedInstance
2. 重寫allocWithZone方法,並使用dispatch_once_t,從而保證在多線程情況下,
同樣只能實例化一個對象副本
3. 建立一個以shared開頭的類方法實例化單例對象,便於其他類調用,同時不容易引起歧義
同樣用dispatch_once_t確保只有一個副本被建立
關於被搶奪資源使用的注意事項
在多線程應用中,所有被搶奪資源的屬性需要設置爲原子屬性
系統會在多線程搶奪時,保證該屬性有且僅有一個線程能夠訪問
注意:使用atomic屬性,會降低系統性能,在開發多線程應用時,儘量不要資源
另外,atomic屬性,必須與@synchronized(同步鎖)一起使用
*/
// 使用內存地址實例化對象,所有實例化方法,最終都會調用此方法
// 要實例化出來唯一的對象,需要一個變量記錄住第一個實例化出來的對象
+ (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;
}
@end