IOS单例

实现单例模型需要做的三件事: 1.使用全局静态变量记录一个被实例化的对象

2.重写allowWithZone方法,并使用dispath_once_t,从而保证在 多线程的情况下,也能实例化一个对象

  static dispath_once_t onceToken; dispatch_once(&onceToken, ^{

  SharedInstance = [super allocWithZone:zone];

});

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;

}

posted on 2013-10-07 21:09  幸福继续  阅读(241)  评论(0)    收藏  举报

导航