现公司的项目中很依赖单例,各种单例。
好多年的项目,无力改变现状,说几点单例的弊端吧
1、内存占用问题,众所周知,单利会一直占用内存,创建过多的单例,内存一直得不到释放。然而就实际使用情况来看,目前公司的项目在iPhone4s上面占用内存不过60多MB,在可接受范围内。这点不算最大的弊端
2、数据异常问题,一个单例可能多个地方使用,多个地方更改数据,多个地方有各种回调操作。这个情况稍不注意就有可能酿成大错。我认为这个问题是目前单例的最大弊端
3、线程问题,按照规范来自然不会因线程出现问题,也不容易出问题,凡事皆有例外,万一是个不守规则的愣头青呢。
暂时想到这么多弊端,欢迎补充。
鉴于项目中的单例真的太多,思考销毁单例的方法...有点傻.
假定创建单例方式
static Instance *_instance = nil;
static dispatch_once_t onceToken;
+ (instancetype)sharedManager
{
dispatch_once(&onceToken, ^{
_instance= [[self alloc] init];;
});
return _instance;
}
那么销毁单例
+ (void)destroy{
_instance=nil;
onceToken=0l;
}
说明:dispatch_once_t参数的初始值就是0l,只需要重置dispatch_once_t参数及实例参数
通常情况下,一般都是工具类,数据类声明为单例,很少有ViewController声明为单例的,然而,我们突然有了这样的需求。
项目中最近集成了Flutter,flutter目前对iOS还不是很友好,框架内存泄漏,自身高度还不够,暂时无法解决内存泄漏的问题,每次进入flutter页面,然后退出flutter模块儿有60MB左右的泄漏.折中考虑,暂时用单例去创建vc...尴尬
问题就出在这个单例vc上,在iOS中,同一个实例vc,即内存地址完全相同的vc,不允许同时被push两次及以上,否则crash。所以如果你对vc是单例,也需要特殊处理
网友评论