iOS 单例

开发过程中单例用的比较多,但是一些细节的地方之前确实没怎么注意,我们常用的单例声明
#import "Share.h"
static Share *instance = nil;
@implementation Share
+ (instancetype)shareInit
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[Share alloc] init];
});
return instance;
}
在头文件声明一个属性

@property(nonatomic,strong)NSString *name;

在一些需要登录的项目中,可能会用这个单例对象记录一些登录用户信息,

Share *share = [Share shareInit];
share.name = @"xiaoming";

切换登录用户的时候需要把一些共享信息清除掉,起初我是这样

Share *share = [Share shareInit];
share = nil;

但发现再次调用这个单例对象,他还是存在,这点源于我渣渣的c语言基础,

share = nil;

这句话只是把指向单例对象的这个share指针指向了nil,单例对象并没有改变,所以我在单例类中再加一个销毁的方法

+ (void)remove
{
    instance = nil;
}

在切换登陆的时候我调用这个方法,over,等等,貌似有点别的问题,我怎么再次创建这个单例呢,没办法,dispatch_once是在app整个生命周期内只会调用一次的,所以remove方法中不能这样写,改成下边
+ (void)remove
{
instance.name = nil;
}
这是一种方法,另外一种途径是改写单例方法
+ (instancetype)shareInit
{
@synchronized (self) {
if (!instance) {
instance = [Share new];
}
}
return instance;
}
这样在这个单例remove方法中直接把这个静态变量置为nil就可以了,切换登录再次给这个静态变量赋新值就可以了,这个小问题之前没有注意过,也因为自己c语言基础不够扎实,基础还是重要啊

你可能感兴趣的:(iOS 单例)