美文网首页
最健壮的单例

最健壮的单例

作者: i爱吃土豆的猫 | 来源:发表于2021-04-15 20:13 被阅读0次

单例的健壮性
要是自己用的话,直接用shareInstance方法创建没啥问题,但是如果同组或者别人没注意用alloc创建、或者别人不小心使用copy、mutableCopy就可能产生两个实例,也就不存在单例。健壮性就是要保持怎么创建就这个实力,就返回位子的内存地址。

// 实现copy协议
@interface SignalModel()<NSCopying, NSMutableCopying>

@end


+ (instancetype)shareInstance {
    static Singleton * _instance = nil;
    static dispatch_once_t onceToken ;
    dispatch_  once(&onceToken, ^{
    _instance = [[super allocWithZone:NULL]  init] ;
    //不是使用alloc方法,而是调用[[super allocWithZone:NULL] init] 
    //已经重载allocWithZone基本的对象分配方法,所以要借用父类(NSObject)的功能来帮助出处理底层内存分配的杂物
    }) ;
    return _instance ;
}

//用alloc返回也是唯一实例
+(id) allocWithZone:(struct _NSZone *)zone {
    return [Singleton shareInstance] ;
}
//对对象使用copy也是返回唯一实例
-(id)copyWithZone:(NSZone *)zone {
      return [Singleton shareInstance] ;//return _instance;
}
//对对象使用mutablecopy也是返回唯一实例
-(id)mutableCopyWithZone:(NSZone *)zone {
       return [Singleton shareInstance] ;
}
@end    

上面代码注意点:

1. 当static关键字修饰局部变量时,只会初始化一次且在程序中只有一份内存
2. copyWithZone mutablecopyWithZone 这个类遵守<NSCopying,NSMutableCopying>协议
3. 如果_instance = [self alloc] init];创建的话,将会和-(id) allocWithZone:(struct _NSZone *)zone产生死锁。 dispatch_once中的onceToken线程被阻塞,等待onceToken值改变。
4. 当用alloc创建对象、以及对对象进行copy mutableCopy也是返回唯一实例

相关文章

  • 最健壮的单例

    单例的健壮性要是自己用的话,直接用shareInstance方法创建没啥问题,但是如果同组或者别人没注意用allo...

  • iOS-单例的几种写法

    一、静态指针方式(单线程模式单例) 二、多线程加锁单例 三、单例的健壮性 由于水平有限,难免出现纰漏,如有问题还请...

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • 你真的会写单例吗?

    你真的会写单例吗? 摘录来源 单例的正确姿势 Java单例模式可能是最简单也是最常用的设计模式,一个完美的单例需要...

  • Java四种单例设计模式

    Java中的四种单例模式 单例模式是最容易理解的设计模式之一,介绍Java中单例模式的四种写法。 1.基本单例模式...

  • 设计模式之单例模式

    今日看了下比较常用的单例模式。整体带大家看一下单例模式。 单例是什么 最简单的一种设计模式。比较典型的单例的应用,...

  • 2、创建型设计模式-单例设计模式

    江湖传言里的设计模式-单例设计模式 简介:什么是单例设计模式和应用 备注:面试重点考查 单例设计模式:这个是最简单...

  • Java中单例模式你用的哪一种?

    一起讨论java中的单例模式。单例模式是java设计模式中算是最简单的设计模式了。 * java实现单例模式的写法...

  • 最简单的单例

    不啰嗦,因为太简单,直接上代码 使用时: 原来的饿汉: 原来的懒汉:

  • JAVA学习笔记(三)

    前言: 这周忙的不行,没学多少东西,就简单的学习下Java的单例吧。 设计模式之单例 单例模式是最简单也是最常用的...

网友评论

      本文标题:最健壮的单例

      本文链接:https://www.haomeiwen.com/subject/omboihtx.html