什么是单例模式
- 简单的来说,一个单例类,在整个程序中只有一个实例,并且提供一个类方法供全局调用,在编译时初始化这个类,然后一直保存在内存中,到程序(APP)退出时由系统自动释放这部分内存。
- 单例模式是一种常用的设计模式,对于一个单例类,必须保证任意时刻只有一个单例对象,并且自行实例化该对象,并向整个系统提供该对象,也就是说无论实例化单例对象多少次,都只能创建出一个对象,该对象是全局的能够整个系统所访问
- 单例对象很像c语言中全局变量,单例类可以实现不同对象之间的数据共享
单例类举例
UIApplication
(应用程序实例类)NSNotificationCenter
(消息中心类)NSFileManager
(文件管理类)NSUserDefaults
(应用程序设置)NSURLCache
(请求缓存类)NSHTTPCookieStorage
(应用程序cookies池)
单例类使用时机?
官方说法:
一个类必须只有一个对象。客户端必须通过一个众所周知的入口访问这个对象。
这个唯一的对象需要扩展的时候,只能通过子类化的方式。客户端的代码能够不需要任何修改就能够使用扩展后的对象。举例说明:在建模的时候,如果这个东西确实只需要一个对象,多余的对象都是无意义的,那么就考虑用单例模式。比如,存储用户信息的用户管理类,在登录成功后,其它各个业务模块都可能用到。所以就会考虑用单例。
流程图
单例模式举例
- 获取单例
@interface Singleon : NSObject
+ (instancetype)sharedSingle;
@end
+ (void)load
:加载类,每次程序启动,就会创建一个_instance的空间进去- 重写单例类的
alloc
方法保证这个类只会被初始化一次
#import "Singleon.h"
static Singleon *_instance = nil;
@implementation Singleon
+ (void)load {
_instance = [[self alloc] init];
}
+ (instancetype)sharedSingle {
NSLog(@"运行");
return _instance;
}
+ (instancetype)alloc {
//如果已经初始化了
if (_instance) {
NSException *exception = [NSException exceptionWithName:@"提示" reason:@"OneTimeClass类只能初始化一次" userInfo:nil];
[exception raise];
}
return [super alloc];
}
@end
git
git地址:点击此处
单例模式有什么优缺点?
优点:
- 在整个程序中只会实例化一次,所以在程序如果出了问题,可以快速的定位问题所在
- 由于在整个程序中只存在一个对象,节省了系统内存资源,提高了程序的运行效率;
缺点:
- 不能被继承,不能有子类
- 不易被重写或扩展(可以使用分类)
- 同时,由于单例对象只要程序在运行中就会一直占用系统内存,该对象在闲置时并不能销毁,在闲置时也消耗了系统内存资源