1、ARC下的单例实现 |
说明:在用户实例化的方法控制单次执行,同时开放单例的初始化方法。spa
-(instancetype)init{ self=[super init]; if(self){ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ }); } return self; } static id instance; +(instancetype)allocWithZone:(struct _NSZone *)zone{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance=[super allocWithZone:zone]; }); return instance; } + (instancetype) shareAudio{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance=[[self alloc]init]; }); return instance; } +(id)copyWithZone:(struct _NSZone *)zone{ return instance; }
2、MRC下的单例实现 |
说明:在用户实例化的方法控制单次执行,同时开放单例的初始化方法,因为当前为MRC因此须要控制参内存管理的方法单次执行,所以相比ARC须要增长:code
static id instance; +(instancetype)allocWithZone:(struct _NSZone *)zone{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance=[super allocWithZone:zone]; }); return instance; } + (instancetype) shareAudio{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance=[[self alloc]init]; }); return instance; } -(oneway void)release{ } -(instancetype)autorelease{ return instance; } -(instancetype)retain{ return instance; } -(NSUInteger)retainCount{ return 1; }
3、兼容MRC 和ARC的宏定义 |
说明:为了方便后期的引用,能够将单例抽取为宏定义,鉴于抽取的时候考虑到当前的手动计数和自动计数所以引入条件编译:blog
#if !__has_feature(objc_arc) ======当前是ARC #else ======当前是MRC #endif 代码: #define singleton_h(name) + (instancetype) share##name; #if !__has_feature(objc_arc) #define singleton_m(name)\ static id instance;\ +(instancetype)allocWithZone:(struct _NSZone *)zone{\ static dispatch_once_t onceToken;\ dispatch_once(&onceToken, ^{\ instance=[super allocWithZone:zone];\ });\ return instance;\ }\ \ \ + (instancetype) share##name{\ static dispatch_once_t onceToken;\ dispatch_once(&onceToken, ^{\ instance=[[self alloc]init];\ });\ return instance;\ }\ -(oneway void)release{\ }\ \ -(instancetype)autorelease{\ return instance;\ }\ \ -(instancetype)retain{\ return instance;\ }\ \ +(id)copyWithZone:(struct _NSZone *)zone{\ return instance;\ }\ -(NSUInteger)retainCount{\ return 1;\ } #else #define singleton_m(name)\ static id instance;\ +(instancetype)allocWithZone:(struct _NSZone *)zone{\ static dispatch_once_t onceToken;\ dispatch_once(&onceToken, ^{\ instance=[super allocWithZone:zone];\ });\ return instance;\ }\ \ \ + (instancetype) share##name{\ static dispatch_once_t onceToken;\ dispatch_once(&onceToken, ^{\ instance=[[self alloc]init];\ });\ return instance;\ }\ \ +(id)copyWithZone:(struct _NSZone *)zone{\ return instance;\ } #endif
4、文件引用 |
1 在.h文件引用singleton_h(audio);内存
2 在.m文件引用singleton_m(audio);it