ios 单例重新初始化方法

众所周知 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;

}



至此,当外部调用 resetInstance方法时 实现了重置单例的功能。 再次多说一句正确的单列模式还要重写

allocWithZone方法,放置开发人员误调用单列的alloc方法初始化。在此就不多说了。还有一个小细节在重新清空单例的前后

_instance的指针地址是不一样的 ,说明单例确实在APP运行周期内重新初始化了 并且重新分配了地址 而且之前的单列确实也被释放了因为走了dealloc方法。希望有什么观点大家一起留言探讨

微笑






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值