单例模式严谨

关于单例模式的实现主要是static调用后存储空间不释放的特性使得实例在程序的生命周期中保持唯一,根据这个特点,如果要解决前面的问题,可以在allocWithZone里调用接口sharInstance方法,在copyWithZone里直接返回实例,具体实现如下:

@implementation XNShareTool
/**
 步骤:
 1.一个静态变量_inastance
 2.重写allocWithZone, 在里面用dispatch_once, 并调用super allocWithZone
 3.自定义一个sharedXX, 用来获取单例. 在里面也调用dispatch_once, 实例化_instance
 -----------可选------------
 4.如果要支持copy. 则(先遵守NSCopying协议)重写copyWithZone, 直接返回_instance即可.
 */
/**第1步: 存储唯一实例*/
static XNShareTool *_instance;

/**第2步: 分配内存孔家时都会调用这个方法. 保证分配内存alloc时都相同*/
+(id)allocWithZone:(struct _NSZone *)zone{
    //调用dispatch_once保证在多线程中也只被实例化一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [super allocWithZone:zone];
    });
    return _instance;
}

/**第3步: 保证init初始化时都相同*/
+(instancetype)sharedTool{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[XNShareTool alloc] init];
    });
    return _instance;
}

/**第4步: 保证copy时都相同*/
-(id)copyWithZone:(NSZone *)zone{
    return _instance;
}

@end
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,256评论 19 139
  • 单例模式 什么是单例模式? 单例模式想一个大独裁者,他规定在他的国度里面,所有数据的访问和请求都得经过他,甚至你要...
    GitHubPorter阅读 1,206评论 0 4
  • @WilliamAlex大叔 前言 目前流行的社交APP中都离不开单例的使用,我们来举个例子哈,比如现在流行的"糗...
    Alexander阅读 1,953评论 6 28
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,839评论 18 399
  • 期待你的爱£平凡之路 知晓这首歌时,是在县城体育坪的CC吧。那晚,临近夜里10点钟左右,我在和一群朋友分开后独自一...
    萧臻彬阅读 269评论 0 1