参考文章
[iOS开发]单例模式
iOS—单例模式
什么是单例模式
一个单例类,在整个程序中只有一个实例,这个实例被创建以后,就一直到这个程序(APP)结束后系统才会自动释放这块内存,而且一旦你创建了一个单例类,不论你在多少个界面中初始化调用了这个单例方法取得对象,它们所有的对象都是指向的同一块内存存储空间(即单例类保证了该类的实例对象是唯一存在的一个)。
简单来说就是:保证整个系统中一个类只有一个对象的实例,实现这种功能的方式就叫单例模式。
系统提供的单例类举例
- UIApplication(应用程序实例类)
- NSNotificationCenter(消息中心类)
- NSFileManager(文件管理类)
- NSUserDefaults(应用程序设置)
- NSURLCache(请求缓存类)
- NSHTTPCookieStorage(应用程序cookies池)
单例模式使用的时机
当一个类所需要的对象只为一个时,举个例子吧:网站的计数器,一般也是采用单例模式实现,如果你存在多个计数器,每一个用户的访问都刷新计数器的值,这样的话你的实计数的值是难以同步的。但是如果采用单例模式实现就不会存在这样的问题,而且还可以避免线程安全问题。同样多线程的线程池的设计一般也是采用单例模式,这是由于线程池需要方便对池中的线程进行控制。
单例模式的优缺点
优点:
- 在内存中只有一个对象,节省内存空间;
- 避免频繁的创建销毁对象,可以提高性能;
- 避免对共享资源的多重占用,简化访问;
- 为整个系统提供一个全局访问点。
缺点:
- 不适用于变化频繁的对象;
- 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;
- 如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失;
举例:
Singleon.h
@interface Singleon : NSObject
+ (instancetype)sharedSingle;
@end
Singleon.m
static Singleon *_instance;
@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];
}
ViewController.m
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
Singleon* single = [[Singleon alloc] init];
Singleon* single_one = [[Singleon alloc] init];
NSLog(@"%@", single);
NSLog(@"%@", single_one);
}
如果在app运行开始时就加载,
+ (void)load {
_instance = [[self alloc] init];
}
扫描二维码关注公众号,回复:
13413286 查看本文章