#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface User : NSObject
/**
单例方法
@return 返回单例对象
*/
+(instancetype)sharedInstance;
/**
销毁对象
*/
+(void)attempDealloc;
/**
登录名
*/
@property(nonatomic,copy) NSString *strAccount;
/**
密码
*/
@property(nonatomic,copy) NSString *password;
@end
NS_ASSUME_NONNULL_END
#import "NGUser.h"
@implementation User
static NGUser *sharedInstance = nil;
static dispatch_once_t onceToken;
+ (instancetype)sharedInstance{
dispatch_once(&onceToken, ^{
//调用父类的allocWithZone,不能使用self,避免循环引用
sharedInstance = [[super allocWithZone:NULL] init];
});
return sharedInstance;
}
//必须要实现的,当我们创建一个对象,alloc会给对象分配内存,init初始化数据
//alloc会调用allocWithZone,如果创建对象没有使用sharedInstance,而是使用alloc
//那么alloc就会调用allocWithZone,重写类方法,调用sharedInstance使得alloc时创建的也是单例对象
+(instancetype)allocWithZone:(struct _NSZone *)zone{
return [self sharedInstance];
}
//单例对象被copy
-(id)copyWithZone:(nullable NSZone *)zone{
return self;
}
+(void)attempDealloc{
onceToken = 0; // 只有置成0,GCD才会认为它从未执行过.它默认为0.这样才能保证下次再次调用shareInstance的时候,再次创建对象.
sharedInstance = nil;
}
@end