实现单例模型须要作的三件事: 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;
}