单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为 单例的特殊类
。通过单例模式可以保证系统中一个类只有一个实例.一个类始终只能创建一个实例,这个类就是单例类。
单例类 全局持有
。若有必要可创建 在释放,不过一般使用单例不会频繁的创建又使用,可若使用static静态类对象操作某个类即可实现单例实现的某些功能需求(注:创建单例类在释放是在前期考虑,保持当前对象类唯一,但是此方法并不建议使用,使用static即可实现所要效果
)。
单例类中即使用
ShareInstanchClass *instanceClass = [[ShareInstanchClass alloc]init];
每次初始化使用的 instanceClass 这个单例类对象都是一样的,可直接 alloc init 后使用
优点:
1,实例控制
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
2、灵活性
因为类控制了实例化过程,所以类可以灵活更改实例化过程。
缺点:
1,开销
虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。
2,可能的开发混淆
使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
3,对象生存期
不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。
如何在iOS中使用:
OC语言中:
+(SingleClass*)shareInstance(类方法)
{
//利用GCD创建一个单例模式
//第一个参数predicate,该参数是检查后面第二个参数所代表的代码块是否被调用的谓词,第二个参数则是在整个应用程序中只会被调用一次的代码块。dispach_once函数中的代码块只会被执行一次,而且还是线程安全的。
static SingleClass* single=nil;
static dispatch_once_t once;
dispatch_once(&once, ^{
single = [[SingleClass alloc]init];
});
return single;
}
Swift语言中:
class var defaultSingle : SingalClass
{
struct Static {
static var onceToken : dispatch_once_t = 0
static var single:SingalClass? = nil
}
dispatch_once(&Static.onceToken) {
// 保证只执行一次 为了线程安全
if(Static.single == nil) {
// 第一次执行肯定是空 所以执行判断体 第二次以后就不会执行判断了
Static.single = SingalClass() // 给结构体里面的single创建对象 使其不为空
}
}
return Static.single!
}
1.2及以后使用:
class SwiftySingleton
{
static let shared = SwiftySingleton() // “懒实例化”的全局变量会被自动放在dispatch_once块中[4]
private init(){}
}
单例+方法锁使用
方法锁,作用为:当多个线程同时调用方法的时候,保证只有一个线程在使用该方法.例如:A和B同时调用 defaultSingleton
方法,如果A正在使用该方法,那么B就不能调用,直到A使用完成,B才会执行该方法.这个也保证单例对象的唯一性,避免初始化方法被同时多次执行.
static Singleton *singleton = nil ;
+ (Singleton *)defaultSingleton{
@synchronized(self){
if (singleton == nil){
singleton = [[Singleton alloc] init] ;
}
}
return singleton ;
}