美文网首页
ios单例的修改

ios单例的修改

作者: targeter | 来源:发表于2019-05-17 18:31 被阅读0次

    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;
     }
    

    相关文章

      网友评论

          本文标题:ios单例的修改

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