1. 单例的概念以及在iOS开发中的实现一个单例类
单例概念:保证一个类只有一个实例,并且提供一个访问它的全局访问点。
#import "DataManager.h"
static dispatch_once_t onceToken = 0;
static DataManager * manager = nil;
@implementation DataManager
// 重写load或initialize,保证在调用的时候,此单例已经是有值的了
+ (void)initialize {
NSLog(@"DataManager initialize");
NSLog(@"%@",[self manager]);
}
/// 重写alloc或init方法,防止重复生成此对象,
+ (instancetype)alloc {
if (manager) {
// 方式1:抛异常
// NSException * ex = [[NSException alloc] initWithName:@"异常" reason:@"重复生成DataManager对象" userInfo:@{@"1":@"123"}];
// [ex raise];
// 方式2:也可以返回唯一值,别人写[[DataManager alloc]init]和[DataManager manager]返回的是同一个内存地址
return manager;
}
manager = [super alloc];
return manager;
}
+ (instancetype)manager {
dispatch_once(&onceToken, ^{
if (manager == nil) {
manager = [[DataManager alloc] init];
}
});
return manager;
}
// 清除这个单例,把manager置nil,onceToken置0
+ (void)cleanManager {
onceToken = 0;
manager = nil;
}
@end
swift 版 , 这个在释放的时候有点麻烦。
class SingleClass: NSObject {
static let defaultManager = SingleClass.init()
var money = 13.5
}
在补充一个单例的销毁,应用场景是这样的, 一个用户登录了app,用单例保存了,账号,密码之类的信息,当用户退出时,需要把信息删除掉, 但是一个一个属性置nil太麻烦了,那就干脆在重新登录的时候, 再次alloc 一个吧, 在用户注销时写, 等到其他地方在获取的时候, 会重新执行dispatch_once内部的代码.
// 清除这个单例,把manager置nil,onceToken置0
+ (void)cleanManager {
onceToken = 0;
manager = nil;
}
为什么写 0l? 因为
typedef long dispatch_once_t;
官方写的别名,默认值是0,
* A predicate for use with dispatch_once(). It must be initialized to zero.
* Note: static and global variables default to zero.