一、基本知识点
1、什么是单例模式
简单的来说,一个单例类,在整个程序中只有一个实例,并且提供一个类方法供全局调用,在编译时初始化这个类,然后一直保存在内存中,到程序(APP)退出时由系统自动释放这部分内存。
2、系统提供的单例类
UIApplication(应用程序实例类)
NSNotificationCenter(消息中心类)
NSFileManager(文件管理类)
NSUserDefaults(应用程序设置)
NSURLCache(请求缓存类)
NSHTTPCookieStorage(应用程序cookies池)
3、在哪些情况下会用到单例模式
经常调用的类,入工具类、公共跳转类等,可以采用单例模式。
4、是否可以重复初始化单例类?
一个单例类只能被初始化一次。
二、单例类的生命周期
1、不同变量在存储器中位置
位置 | 存放的变量 |
---|---|
栈 | 临时变量(由编译器管理自动创建/分配/释放的,栈中的内存呗调用时处于存储空间中,调用完毕后由系统自动释放内存) |
堆 | 通过alloc、calloc、malloc或new申请内存,由开发者手动调用之后通过free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后释放掉动态内存,在ARC模式下,由系统自动管理 |
全局区域 | 静态变量(编译时分配,APP结束时由系统释放) |
常量 | 常量(编译时分配,APP结束时由系统释放) |
代码区 | 存放代码 |
2、单例实例在存储器中位置
在程序中,一个单例类在程序中只能初始化一次,为了博阿正在使用中始终都是存在的,由上表可以看出,单例是存储在 全局区域 的,在编译时分配内存,只要程序还在运行就会一只占用内存,在APP结束后由系统释放这部分内存。
三、单例类创建
1、单例模式的创建方式
考虑数据和线程问题,苹果官方推荐开发者使用
来创建单例。
static OneTimeClass *__onetimeClass;
+ (OneTimeClass *)sharedOneTimeClass {
static dispatch_once_t oneToken;
dispatch_once(&oneToken, ^{
__onetimeClass = [[OneTimeClass alloc]init];
});
return __onetimeClass;
}
四、单例模式的优缺点
1、优点
(1)在整个程序中只会实例化一次,所以在程序如果出了问题,可以快速的定位问题所在。
(2)由于在整个程序中只存在一个对象,节省了系统内存资源,提高了程序的运行效率。
2、缺点
(1)不能被继承、不能有子类。
(2)不易被重写或扩展(可以使用分类)。
(3)由于单例对象只要程序在运行中就会一直占用系统内存,该对象在闲置时并不能销毁,在闲置时也消耗了系统内存资源。