概念
在整个项目中只有一份内存,并不会分配很多内存,这个类的对象只能被初始化一次
单例的使用
方式一:不考虑线程
示例:
+ (instancetype)shareInstance {
static LYUserManager *userManager;
if(!userManager){
userManager = [[LYUserManager alloc] init];
return userManager;
}
}
方式二:考虑线程
- 声明一个静态变量去保存类的实例,确保它在类中的全局可用性
- 声明一个静态变量dispatch_once_t,它确保初始化代码只执行一次
示例:
+ (instancetype)shareInstance {
static LYUserManager *userManager;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
userManager = [[LYUserManager alloc] init];
});
return userManager;
}
单例的优化并设置断言
通过上面的方法,我们已经可以使用类方法来得到这个单例,但是如果是多人开发此项目,为了安全与管理代码的方便,也为了给不是这个单例的创作者但会用到这个单例的开发人员一些提示,让任何视图通过alloc创建对象的程序段断在此处,给程序员提示.我们通常会重写一些方法:
示例:
+ (instancetype)alloc{
NSAssert(0, @"这是一个单例对象,请使用+(LYUserManager *)shareInstance方法");
return nil;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
return [self shareInstance];
}
+ (instancetype)new{
return [self shareInstance];
}
网友评论