单例设计模式

单例模式是一种常用的软件设计模式。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

苹果中的单例模式

1
$ [NSUserDefaults standardUserDefaults]
1
$ [UIApplication sharedApplication]
1
$ [UIScreen mainScreen]
1
$ [NSFileManager defaultManager]

1、单例实现 — 普通创建

利用单例设计模式,自定义了一个数据管理类,DataManager;核心思想是定义一个只创建一次的创建对象的方法;

+(instancetype) shareDataManager;

+(instancetype) shareDataManager{                                
//创建一个唯一的对象
static DataManager * manager = nil;
if(manager == nil)
{
    manager = [DataManager alloc] init];    
}
    return manager;                                    
}

关键词 static

static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上的空间

作用

static静态变量声明符。在声明它的程序块,子程序块或函数内部有效,值保持,在整个程序期间分配存储器空间,编译器默认值0。

一个静态变量的值保持在所有函数/方法调用。为什么要引入static

函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函 数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围,使得在此函数中定义的变量,不仅仅受此函数控制.
总的来说他为这个类服务,明白这点就很好理解单例的实现了

2、 基于GCD的dispatch_once的单例设计

在GCD中,有一个函数dispatch_once,可以实现代码段的一次性执行,和static修饰的变量赋值的一次性一样,我们结合static和dispatch_once,就可以简单的实现单例。

+(instancetype)sharedInstance;

+(instancetype)sharedInstance{        
    static id sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    sharedInstance = [[self alloc] init];
});                                                            
    return sharedInstance;
}