有时某个类需要一个实例就可以了,比如ios 中的NSFileManager, NSUserDefault,在app运行的任何时刻,都只有一个实例。
一般用来管理共享的资源、逻辑等。
1. 以下是在ios中构建单例的一种逻辑比较完善的方法,考虑了copy,alloc 的使用情况
static TBOGameSetting * _sharedInstance;
+(instancetype)sharedGameSetting{
_sharedInstance=[[self alloc]init];
return_sharedInstance;
}
+(instancetype)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//dispatch_once 保证在程序运行中只执行一次
_sharedInstance=[[super allocWithZone:zone]init];
});
return _sharedInstance;
}
-(id)copy{
return _sharedInstance;
}
2. 业务中,单例一般管理共享的资源,而单例一般初始化后就不再释放,
为了更有效的利用内存,有必要暴露一个清除数据的接口,如下:
可以再合适的时候清理管理的数据,以节省内存。
-(void)clearData;
3. 在单例中要小心使用block,
单例在app一个session中一般不释放,如果在单例中不当使用block,有可能单例会一直保持对其它对象(也许已经需要了)的引用,导致内存泄露。
4. 另外还要注意是否有子类化的需求,及多线程访问的需求是否能够满足