单例模式(掌握)
- 单例模式
- 作用
- 可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问
- 方便地控制了实例个数,并节约系统资源
- 使用场合
- 在整个应用程序中,共享一份资源(这个资源只需要创建初始化一次)
- 网络请求工具类
- NSFileManager defaultManager
- UIApplication sharedApplication
- 单例模式实现
- 1.创建一个继承NSObject的图片下载工具类
- 2.工具类创建出来的对象永远都是同一个对象
- alloc]init
- 重写alloc方法
- 类方法
- alloc方法内部会调用allocWithZone:
- allocWithZone:
- 重写allocWithZone:
- 定义静态变量,分配存储空间
- 3.提供一个类方法,方便外界访问(身份标识)
- 规范:share+类名 | share | default |manager
创建一个静态变量:分配存储空间
static DownloadTool *_instance;
@synchronized(self){
if(_instance == nil){
_instance = [super allocWithZone:zone];
}
return _instance
}
提供一个类方法
规范:share+类名 | share | default |manager
+(instancetype)shareDownloadTool{
return [[self alloc]init];
}
- 问题:如何让变量私有化,作用域只在当前类,外部不可以使用
- 问题:异步函数+全局并发队列,在block里面创建工具类,开多条线程并发执行任务,比如开线程A/B,第一次Ainstance没有值,B进来instance也没有值,分配了两次存储空间。
- 加同步锁,@synchronized(self){}
- GCD的一次性代码
- dispatch_once(&onceToken,^{_instance = [super allocWithZone:zone];})
- 4.单例模式实现更严谨需要重写copy|mutablecopy方法
- 遵守<NSCoping,NSMutableCoping>
- 调用copy方法,需要对象调用
-(id)copyWithZone:(NSZone*)zone{
return _instance;
}
-(id)mutableCopyWithZone:(NSZone*)zone{
return _instance;
}
简洁单例模式(不完全单例模式)
+(instancetype)shareTool{
static Tool * _instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^{
_instance = [[self alloc]init];
})
return _instance
}
- 使用前提
- 开发中,如果时间比较紧张压力比较大,可以使用这种方法,如果是独自开发,也可以使用这种方式;但是,如果是多人开发,建议使用完整的单例模式实现方式