本帖最后由 竹林风 于 2018-12-12 16:38 编辑
单例模式的概念
简单的来说,一个单例类,在整个程序中只有一个实例,并且提供一个类方法供全局调用,在编译时初始化这个类,然后一直保存在内存中,到程序(APP)退出时由系统自动释放这部分内存。
在iOS系统中,下面这些类使用的就是单例模式
- UIApplication (应用程序实例类)
- NSNotificationCenter (消息中心类)
- NSFileManager (文件管理类)
- NSUserDefaults (应用程序设置)
- NSURLCache (请求缓存类)
- NSHTTPCookieStorage (应用程序cookies池)
这些就是系统为数我们提供的一些单例类
在开发中哪些情况我们会用到单例模式呢?
一般我个人在开发中,一些经常调用的类,如工具类,公共跳转类等,,我都会使用单例模式。
单例模式的生命周期是怎样的呢?
下面是程序中不同变量在手机存储器中的位置
1.栈 (临时变量(由编译器管理自动创建/分配/释放的,栈中的内存被调用时处于存储空间中,调用完毕后由系统系统自动释放内存)2.堆 通过alloc、calloc、malloc或new申请内存,由开发者手动在调用之后通过free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存,在ARC模式下,由系统自动管理。
3.全局区域 静态变量(编译时分配,APP结束时由系统释放)
4.常量 [backcolor=rgba(181, 181, 181, 0.1)]常量(编译时分配,APP结束时由系统释放)
在程序中,一个单例类在程序中只能初始化一次,为了保证在使用中始终都是存在的,所以单例是在存储器的全局区域,在编译时分配内存,只要程序还在运行就会一直占用内存,在APP结束后由系统释放这部分内存内存。
新建一个单例
考虑数据和线程问题,苹果官方推荐开发者使用dispatch_once_t来创建单例,那么我就采用dispatch_once_t方法来创建一个单例,类名为MySqlite
[Objective-C] 纯文本查看 复制代码 +(instancetype)shareMySqlite{
static MySqlite *mySqlite;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
mySqlite = [[MySqlite alloc] init];
});
return mySqlite;
}
单例模式的优缺点:
a 优点
(1)、在整个程序中只会实例化一次,所以在程序如果出了问题,可以快速的定位问题所在;
(2)、由于在整个程序中只存在一个对象,节省了系统内存资源,提高了程序的运行效率;
b 缺点
(1)不能被继承,不能有子类; (2)不易被重写或扩展(可以使用分类); (3)同时,由于单例对象只要程序在运行中就会一直占用系统内存,该对象在闲置时并不能销毁,在闲置时也消耗了系统内存资源;
单例使用
[MySqlite shareMySqlite] 这样我们就获得了这个单例类,可直接调用类里的变量和方法。
|