在一个ios应用中,有时候我们只需要某个类的一个实例。即是在整个项目中,这个类的对象只能被初始化一次。
例如,当应用程序启动时,应用的状态由UIApplication类的一个实例维护,这个实例则代表了整个"应用程序对象",它只能是一个实例,其作用是实现整个应用程序中一些共享资源的访问和状态的保持等。
说通俗点,通常代表一些物理设备,比如打印机。或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据。用单例模式加以控制是非常有必要的。
OS中好几个类都是采用了单例模式,比如NSApplication, NSFontManager, NSDocumentController,NSHelpManager, NSNull,NSProcessInfo, NSScriptExecutionContext, NSUserDefaults。
OC实现原理:
//Singleton.h
@interface Singleton:NSObject
+(Singleton *)sharedManager;
@property (nonatomic,strong)NSString *singletonData;
@end
//Singleton.m
#import"Singleton.h"
@implementation Singleton
@sysnthesize singletonData=_singletonData;
static Singleton *sharedManager=nil;
+(Singleton *)sharedManager {
static dispatch_once_t_once;
dispatch_once(&once,^{
sharedManager=[[]self alloc]init];
});
return sharedManager;
}
@end
上面用了GCD技术,作用是在整个应用生命周期中只执行一次代码块^{......}。使用时需要将GCD地址传给dispatch_oce函数。dispatch_once函数能够记录该代码块是否被调用过。
dispatch_once函数不仅意味着代码仅会被运行一次,而且还意味着此运行还是线程同步。也就是说,当我们使用dispatch_once函数时,就不要需要使用@synchronized之类的语句。
Swift实现原理
import Foundation
class Singleton {
class var sharedInstance:Singleton { //静态计算属性
struct Static { //定义结构体
static var instance:Singleton? //定义静态属性instance 用来保存singleton的子单例对象
static var token:dispatch_once_t=0 //定义静态属性token,是dispatch_once_t的类型
}
dispatch_once(&Static.token) { //传地址给dispatch_once .记录该代码块是否被调用过。同时意味着线程同步。
Static.instance=Singleton() //实例化Singleton对象
}
return Static.instance! //返回实例
}
}
swift设计单例模式非常灵活,有非常多的方式。上面是考虑线程安全的单例模式。
有错误之处还望大神指正,交流。