iOS中的单例模式设计模式
就我自己理解而言,我认为的单例:单例在整个工程中,就至关于一个全局变量,就是不论在哪里须要用到这个类的实例变量,均可以经过单例方法来取得,并且一旦你建立了一个单例类,不论你在多少个界面中初始化调用了这个单例方法取得对象,它们全部的对象都是指向的同一块内存存储空间(即单例类保证了该类的实力对象是惟一存在的一个).缓存
“单例模式”是咱们在iOS中最常使用的设计模式之一。单例模式不须要传递任何参数,就有效地解决了不一样代码间的数据共享问题。单例类是一个很是重要的概念,由于它们表现出了一种十分有用的设计模式。单例类的应用贯穿于整个iOS的SDK中。例如,UIApplication类有一个方法叫sharedApplication,从任何地方调用这个方法,都将返回与当前正在运行的应用程序相关联的UIApplication实例。除了这个,NSNotificationCenter(消息中心) 、NSFileManager(文件管理) 、 NSUserDefaults(持久化存储数据) 、NSURLCache(请求缓存)、NSHTTPCookieStorage(应用程序cookies池)都是系统单例;cookie
单例类保证了应用程序的生命周期中有且仅有一个该类的实例对象,并且易于外界访问。spa
单例模式的优势:线程
1.实例控制:Singleton 会阻止其余对象实例化其本身的 Singleton 对象的副本,从而确保全部对象都访问惟一实例。
2.灵活性:由于类控制了实例化过程,因此类能够更加灵活修改实例化过程。
单例类的实现方法:
(1).经过加线程锁进行实现:
好比建立了一个DBManager的类
+(DBManager *)sharedManager; (.h文件中)
.m文件中的实现:
+(DBManager *)sharedManager{
Static DBManager *manager = nil;
@synchronized(self){
if(manager == nil){
manager = [[DBManager alloc]init];
}
}
return manager;
}
(2).经过GCD实现单例方法:
+(DBManager *)sharedManager; (.h文件中)
.m文件中的实现:
+(DBManager *)sharedManager{
Static DBManager *manager = nil;
static dispatch_once_t token;
dispatch_once(&token,^{
if(manager == nil){
manager = [[DBManager alloc]init];
}
} );
return manager;
}
重写allocWithZone方法,用来保证其余人直接使用alloc和init试图得到一个新实力的时候不产生一个新实例,
+(id)allocWithZone:(NSZone *)zone{
@synchronized(self){
if (!manager) {
manager = [super allocWithZone:zone]; //确保使用同一块内存地址
return manager;
}
return nil;
}
}
适当实现copyWithZone,release和autorelease。
- (id)init;
{
@synchronized(self) {
if (self = [super init]){
return self;
}
return nil;
}
}