众所周知 ios中单例在APP运行周期内只走一次 所以单利中存储的数据都会一直伴随的一次APP生命周期。 但是随着项目业务的不断复杂 有可能会有需要单例要重新初始化更换数据。下面介绍一下怎样实现。
static Model *_instance;
static dispatch_once_t token;
+ (Model *)instance
{
staticdispatch_once_t token;
dispatch_once(&token, ^{
if (!_instance) {
_instance = [[selfalloc] init];
}
});
return_instance;
}
其实 简单的单例模式就是这样。 大家有没有想过 token这个值是干什么的,so token的值决定dispatch_once的block里的代码是否执行所以在单例的m文件中实现一个方法实现把token和_instance清空。在h文件中暴露出来。 这样当外界调动此方法就会清空状态,当外部再次调动instance就会重新初始化。方法如下
- (void)resetInstance{
token = 0;
_instance =nil;
}
这样就会发现dispatch_once的block里的代码重新执行了 但是单例中的各个属性并没有重新初始化 所以在初始化方法处要重新赋初始值。
列入单例有两个属性如下:
@property (nonatomic,copy)NSString *proA;
@property (nonatomic,copy)NSString *proB;
那么在初始化方法里应该这样写
+ (Model *)instance
{
staticdispatch_once_t token;
dispatch_once(&token, ^{
if (!_instance) {
_instance = [[selfalloc] init];
_instance.proA =@"initValue_proA";
_instance.proB =@"initValue_proB";
}
});
return_instance;
}
allocWithZone方法,放置开发人员误调用单列的alloc方法初始化。在此就不多说了。还有一个小细节在重新清空单例的前后
_instance的指针地址是不一样的 ,说明单例确实在APP运行周期内重新初始化了 并且重新分配了地址 而且之前的单列确实也被释放了因为走了dealloc方法。希望有什么观点大家一起留言探讨