单例模式

单例模式(掌握)

  • 单例模式
    • 作用
      • 可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问
      • 方便地控制了实例个数,并节约系统资源
    • 使用场合
      • 在整个应用程序中,共享一份资源(这个资源只需要创建初始化一次)
      • 网络请求工具类
      • NSFileManager defaultManager
      • UIApplication sharedApplication
  • 单例模式实现
    • 1.创建一个继承NSObject的图片下载工具类
    • 2.工具类创建出来的对象永远都是同一个对象
      • alloc]init
        • 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];
}
  • 问题:如何让变量私有化,作用域只在当前类,外部不可以使用
    • 可以加static
  • 问题:异步函数+全局并发队列,在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辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容