实现单例模型需要做三件事情
1. 使用全局静态变量记录住第一个被实例化的对象
static Ticket *SharedInstance
2. 重写allocWithZone方法,并使用dispatch_once_t,从而保证在多线程情况下,
同样只能实例化一个对象副本
+ (id)allocWithZone:(NSZone *)zone
{
// 解决多线程中,同样只能实例化出一个对象副本
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SharedInstance = [super allocWithZone:zone];
});
return SharedInstance;
}
3. 建立一个以shared开头的类方法实例化单例对象,便于其他类调用,同时不容易引起歧义
同样用dispatch_once_t确保只有一个副本被建立
// 建立一个单例对象,便于其他类调用
+ (Ticket *)sharedTicket
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SharedInstance = [[Ticket alloc]init];
});
return SharedInstance;
}
关于被抢夺资源使用的注意事项:
在多线程应用中,所有被抢夺资源的属性需要设置为原子属性
系统会在多线程抢夺时,保证该属性有且仅有一个线程能够访问
注意:使用atomic属性,会降低系统性能,在开发多线程应用时,尽量不要资源
另外,atomic属性,必须与@synchronized(同步锁)一起使用
本文详细介绍了单例模式的实现步骤:使用全局静态变量记录唯一实例;重写allocWithZone方法确保多线程环境下也只创建一个实例;提供sharedTicket方法方便其他类调用。并强调了多线程下对共享资源进行原子操作的重要性。

1052

被折叠的 条评论
为什么被折叠?



