单例类
在整个程序的生命周期内 , 该类的对象都是唯一的 , 这个程序的生命周期结束时才能结束
iOS中的单例模式
在objective-c中要实现一个单例类 , 至少要做到以下四个步骤:
1、 为单例类穿件一个静态实例 , 并初始化 ,然后设置成nil;
2、实现一个实例构造方法检查上面声明的静态实例是否为nil , 如果是则新建并返回一个本类的实例
3、重写allocWIthZone方法 , 用来保证其他人直接使用alloc和init试图获得一个新的实例的时候不产生一个新的实例
4、适当实现allocWithZone , copyWithZOne ,retain , retainCount, release , 和autorelease,
// 首先先创建一个单例类
在.m文件中定义该单例对象的唯一指针
#import "Teacher.h"
static Teacher *instance = nil; -----------------------------第一步
@implementation Teacher
// 初始化 ,得到该单例对象的唯一接口 , 也就是能得到的唯一的这个类的对象 , 保证实例对象的唯一性
+ (Teacher *)shareTeacher
{
// 若果该单例类的指向空间不存在 , 则创建新的单例对象
if (nil == instance) {---------------------------------第二步
instance = [Teacher alloc] init];
}
return instance;
}
+ (id)allocWithZone:(NSZone *)zone ---------------------第三步
{
// @synchronized(self) {---------------------这个是多线程操作下的线程锁
if (nil == instance)
{
instance = [super allocWithZone:zone];
retain instance;
}
// }
retain nil;
}
// 重写copy方法 , 让外界对该类进行copy的时候 , 不产生新的空间, 直接返回原空间的首地址 , 同样是为了保证实例的唯一性-----------------第四步
- (instancetype)init
{
@synchronized(self) {-------------------- 多线程情况
self = [super init];
if (self) {
// 往往放一些要初始化的变量
}
return self;
}
}
- (id)copy
{
return self;
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
// 重写release方法 保证外界对该类的唯一一个实例对象进行release操作的同时 , 不让该对象release掉
- (oneway void)release
{
;
}
// oneway 主要是真对多线程环境下的单向执行 , 没有“回滚”操作 , 也就是我们所说的原子操作
- (id)autorelease
{
retain self;
}
// 当别人对我们这一块空间进行retain从操作的时候 , 不让该空间retain操作其效果
- (instancetype)retain
{
return self;
}
// 当外界访问这块空间的retainCount值的时候返回 -1 , 或者2^64 - 1 , 其实就是为了告诉访问者 , 这块空间不是那么好管理的 , 你就不要管理了
- (NSUInteger)retainCount
{
return NSUIntegerMax;
}
// 单例方法的实现 ---- 这个是最为安全的方法用GCD创建
+ (XMPPHelper *)shareXMPPHeleper
{
static XMPPHelper *xmppHelper = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
xmppHelper = [[XMPPHelper alloc] init];
});
return xmppHelper;
}
swift版本的单例 , 不同的是我们这里要用到一个结构体
class NetWorkEngine: NSObject {
// 创建结构体的目的就是使用static关键字
struct NetWorkEngineSTR {
// 定义类属性
static var netWorkEingine:NetWorkEngine?
// 定义类属性
static var onceToken:dispatch_once_t = 0
}
// 定义类方法
class func shareNetWorkEngine()->NetWorkEngine {
dispatch_once(&NetWorkEngineSTR.onceToken , {() -> Void in
// 创建NetWorkEngine实例
NetWorkEngineSTR.netWorkEingine = NetWorkEngine()
})
return NetWorkEngineSTR.netWorkEingine!
}
}