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;
}
网友评论