单例模式(掌握)
- 单例模式
- 作用
- 可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问
- 方便地控制了实例个数,并节约系统资源
- 使用场合
- 在整个应用程序中,共享一份资源(这个资源只需要创建初始化一次)
- 网络请求工具类
- 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
}
- 使用前提
- 开发中,如果时间比较紧张压力比较大,可以使用这种方法,如果是独自开发,也可以使用这种方式;但是,如果是多人开发,建议使用完整的单例模式实现方式
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。