一、简介
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
百度百科
二、实用场景
1、需要经常创建和销毁的实例对象。
2、经常使用到的,创建的时候会消耗资源过多的。
3、经常使用到的,创建的时候会很耗时的。
4、一些有状态的工具类。
三、使用
#import "Singleton.h"
static Singleton * _instance = nil;
@implementation Singleton
+(instancetype)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone ];
});
return _instance;
}
+(instancetype) sharedInstance{
if (_instance == nil) {
_instance = [[super alloc]init];
}
return _instance;
}
-(id)copyWithZone:(NSZone *)zone{
return _instance;
}
-(id)mutableCopyWithZone:(NSZone *)zone{
return _instance;
}
四、总结
只有一份实例,不可滥用;不好扩展;可能丢失数据;内存溢出;违背了单一职责原则。
优点
1、在内存中只存在一份实例,节省创建多个实例,从而节省的系统的资源,另外使用GCD的方式是线程安全的。
缺点
1、往往我们使用的单利模式,在通常情况下,都不可能只一项职责,都是多项职责,这样在一定程度上面就违法了“单一职责的原则”。
2、单利类的扩展很难,因为单利没有抽象层,所以在一定程度上扩展很难
3、因为单利是一直存在内存里面的,如果该单利长时间不使用,他会被系统认为是垃圾而被回收,可能导致我们之前设置的一些状态被丢失掉。
4、会导致内存溢出。
网友评论