ios单例的修改

2019-05-17  本文已影响0人  targeter

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;
 }
上一篇下一篇

猜你喜欢

热点阅读