单例模式
在学习的过程中一致对单例模式了解的不是很清楚,今天看到一个博主的文章,感觉略微通透了一些,在此总结一下。
单例模式是一个类在系统中只有一个实例对象,它在整个程序的生命周期中只有一份内存,可以在多个程序中实现数据共享。
为了避免在多线程中在多个程序中同时调用,从而导致单例中数据的不准确性。通过线程加锁,排队执行的方式(@synchronized)或者gcd的方式 -- 通过全局的一个入口点对这个实例对象进行访问(如下图)。因为如果多线程的执行时,可能不同线程同时访问单例时,在短暂的时间片的执行过程中,两个线程同时进入单例,就会就会导致线程不安全性。
单例像一个独裁者,所有的数据访问和请求都的经过它,来确保全局只有一个对象的实例存在。学术说法是,单例模式,为某一类需求和数据提供了统一的程序接口。
ios中单例的实现(arc模式下):
不考虑线程安全:
static SingleCase *manager = nil; + (SingleCase *)defaultManager { if (!manager){ SingleCase = [[self alloc] init]; return manager; } }
考虑线程安全:
//线程加锁 +(Humen *)shared { @synchronized(self) { if (hm == nil) { hm = [[Humen alloc]init]; } } return hm; }
dispatch_once方法的作用就是执行且在整个程序的生命周期中,仅执行一次某一个block对象。 该方法是线程安全的,所以请放心大胆的在子线程中使用。(前提是你的dispatch_once_t *onceToken对象必须是全局或者静态对象。这一点很重要,如果不能保证这一点,也就不能保证该方法只会被执行一次。)
@implementation DZSinglonARC
+ (DZSinglonARC*) shareInstance
{
static DZSinglonARC* share = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
share = [[self alloc] init];
});
return share;
}@end