//保存单例对象的静态全局变量
static id _instance;
+ (instancetype)sharedTools {
return [[self alloc]init];
}
//在调用alloc方法之后,最终会调用allocWithZone方法
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
//保证分配内存的代码只执行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
//这是个对象方法,既然有对象而且是单例,那么调用者就是这个单例对象了,那就返回调用的对象就行
- (id)copyWithZone:(NSZone *)zone {
return self;
}
//这是个对象方法,既然有对象而且是单例,那么调用者就是这个单例对象了,那就返回调用的对象就行
- (id)mutableCopyWithZone:(NSZone *)zone {
return self;
}
#if __has_feature(objc_arc)
//如果是ARC环境
#else
//如果不是ARC环境
//既然是单例对象,总不能被人给销毁了吧,一旦销毁了,分配内存的代码已经执行过了,就再也不能创建对象了。所以覆盖掉release操作
- (oneway void)release {
}
//这是个对象方法,既然有对象而且是单例,那么调用者就是这个单例对象了,那就返回调用的对象就行
- (instancetype)retain {
return self;
}
//为了便于识别,这里返回 MAXFLOAT ,别的程序员看到这个数据,就能意识到这是单例了。纯属装逼……
- (NSUInteger)retainCount {
return MAXFLOAT;
}
#endif
怎么完整的写单例
最新推荐文章于 2024-08-23 17:06:17 发布