在软件工程中,单例是一种用于实现单例的数学概念, 既将类的实例化仅限制成一个对象的一种设计模式.或者我们可以简单地将它理解为一个类,只能实例化一个对象的类.在我们IOS工程中,UiApplication 中至少有一个单例模式的存在;
比如: [UIApplication sharedApplication] 这样就可以在工程里调这个单例;
单例模式的作用 :可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约系统资源。
单例模式的使用场合:在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次),应该让这个类创建出来的对象永远只有一个。
对于目前单例模式的最佳方式,就是GCD出来以后我们所引用的dispatch_once函数创建的单例;
dispatch_once函数,接收一个dispatch_once用于检查该对象是否已经被调用,它还接收一个希望在应用的生命周期中只能被调用一次的代码块,这就是单例的实例化要的;
dispatch_once函数还有一个好处,就是线程安全问题,使用dispatch_once函数,这就意味着你不用再去给单例加@synchronized,也称给单例加锁;关于线程安全为题,个人理解:给单例对象之所以要加锁,是应为系统对于单例对象的内存申请是在堆区,而不是栈区,而我们在调用的时候一般是在栈区去执行它,也就是说每一个线程都可以调用它,而我们知道堆区的内存是有共享性的,为了保证单例对象的唯一性,避免不会在同一时间被调用,我们给他采用的加锁;
代码演示:
.h中
#import@interface Model : NSObject
//单例
+ (instancetype)sharedHandel;
#import "Model.h"
@implementation Model
.m中方法的实现
+ (instancetype)sharedHandel
{
static Model *model = nil;
static dispatch_once_t OnceToken;
dispatch_once(&OnceToken, ^{
model = [[Model alloc] init];
});
return model;
}
@end