美文网首页
iOS中单例创建时不严格造成的问题和解决方法

iOS中单例创建时不严格造成的问题和解决方法

作者: 星光社的戴铭 | 来源:发表于2015-09-06 19:25 被阅读459次

这次项目中遇到了一个单例创建不严格造成了的问题。简单说来就是在有的地方使用了alloc创建了多个实例,当然如果严格按照接口的方法调用是不会有问题的,但是如果项目碰到有不太熟悉的人使用时在处理时就会出现使用其它的方法来创建实例,比如说用alloc,这样本打算使用相同的一个实例成了多个而达不到做这个模式的目的。

关于单例模式的实现主要是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

相关文章

  • iOS中单例创建时不严格造成的问题和解决方法

    这次项目中遇到了一个单例创建不严格造成了的问题。简单说来就是在有的地方使用了alloc创建了多个实例,当然如果严格...

  • ios 开发中的单例模式

    其实iOS开发中的单例模式无非就是一个类创建的对象在程序中只有一个对象! iOS中的单例模式有分为赖汉式和饿汉式单...

  • iOS开发 单例使用问题

    iOS开发 单例使用问题 iOS开发 单例使用问题

  • iOS开发 单例使用问题

    iOS开发 单例使用问题 iOS开发 单例使用问题

  • 严格的单例创建

  • iOS单例模式容错处理

    ios 单例模式容错处理 1、单例模式的使用和问题解决 在ios开发的过程中,使用单例模式的场景非常多。系统也有很...

  • 【设计模式】单例模式

    学习文章 iOS设计模式 - 单例 SwiftSingleton 原理图 说明 单例模式人人用过,严格的单例模式很...

  • 单例模式、异常、模块

    单例模式 创建单例-保证只有1个对象 创建单例时,只执行1次init方法 目的 —— 让 类 创建的对象,在系统中...

  • iOS单例

    在iOS开发中单例用的非常普遍,比如说通知中心,NSUserDefauld等都都是单例模式,原来以为创建一个单例是...

  • iOS单例模式

    1. 利用@synchronized创建单例 ps:严格意义上来说,我们还需要将alloc方法封住,因为严格的单例...

网友评论

      本文标题:iOS中单例创建时不严格造成的问题和解决方法

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