ios单例的修改

OC创建单例的时候确保程序在运行周期的时候,只有一个实例对象,但如果想销毁或者修改单例时,我就不知道该怎么做了,下面是这个问题的说明

首先,我们先看下OC的单例典型写法

+(id)shareInstance{
     static dispatch_once_t onceToken;
      dispatch_once(&onceToken, ^{
      if(_instance == nil)
            _instance = [MyClass alloc] init]; 
    });
     return _instance;
}

先看下dispatch_once_t

dispatch_once_t的描述是typedef long dispatch_once_t;
Description A predicate for use with the dispatch_once function.

dispatch_once展开是

void
_dispatch_once(dispatch_once_t *predicate, dispatch_block_t block)
{
    if (DISPATCH_EXPECT(*predicate, ~0l) != ~0l) {
        dispatch_once(predicate, block);
    }
}
~0l 是 long 的0 取反也就是 一大堆1

关键所在就是这个&onceToken的值,.它默认为0,如果创建成功之后,它就会变成1,只有我们之后再置成0,GCD才会认为它从未执行过,我们就又创建了一次单例,下面是一种写法

1. 必须把static dispatch_once_t onceToken; 这个拿出函数体,成为全局
2. 开始写方法
+(void)attempDealloc{
    onceToken = 0; // 默认为0,如果创建成功之后,它就会变成1,只有我们之后再置成0,GCD才会认为它从未执行过,我们就又创建了一次单例shareInstance的时候,再次创建对象.
    [_instance release];
    _instance = nil;
 }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,161评论 1 32
  • 本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法。这大概是史上最详细、清晰的关于 GCD 的详细讲...
    花花世界的孤独行者阅读 527评论 0 1
  • 批萨饼源至意大利,但是传说是从中国的馅饼变化而成,所以龙的传人--我们做起来,得心应手! ...
    多来米2017阅读 338评论 0 3
  • 连日的几场降雨, 洗刷了空中的尘埃, 也洗涤了我的心灵, 静心沉思, 人生苦短, 当清心寡欲, 顺其自然。
    世事如棋Flora阅读 273评论 0 1
  • 我的弟弟小名叫做土豆,因为他的脑袋和土豆一模一样,所以我们都给他叫土豆。 他非常喜欢火车,是个典型的火...
    吴怡霖阅读 852评论 0 2