方法一:(用互斥锁实现)
1.1在.m中保留一个全局的static的实例static id _instance;1.2重写allocWithZone:方法,在这里创建唯一的实例(注意线程安全)
+ (id)allocWithZone:(struct _NSZone *)zone
{
@synchronized(self) {
if (!_instance) {
_instance = [super allocWithZone:zone];
}
}
return _instance;
}
1,3实现copyWithZone:方法
+ (id)copyWithZone:(struct _NSZone *)zone
{
return _instance;
}
1.4提供1个类方法让外界访问唯一的实例
+ (instancetype)sharedSoundTool
{
@synchronized(self) {
if (!_instance) {
_instance = [[self alloc] init];
}
}
return _instance;
}
2、在非ARC(MRC)中实现单例模式
2.1实现内存管理方法
- (id)retain { return self; }
- (NSUInteger)retainCount { return 1; }
- (oneway void)release {}
- (id)autorelease { return self; }
+ (id)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"%s", __FUNCTION__);
_instance = [super allocWithZone:zone];
});
return _instance;
}
+ (id)copyWithZone:(struct _NSZone *)zone{
return _instance;
}
+ (id)sharedCZPlayer{
// 线程不安全
// if (_instance == nil) {
// _instance = [[self alloc ] init];
// }
// 线程安全
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (!_instance ) {
_instance = [[self alloc ] init];
}
});
return _instance;
}
// 分布式
- (oneway void)release{
}
- (NSUInteger)retainCount{
return 1;
}
- (id)autorelease{
return _instance;
}
- (id)retain{
return _instance;
}
把单例抽取成宏
#ifndef _4_________MRC__single_h
#define _4_________MRC__single_h
#define single_h(className) + (id)shared##className;
#define single_m(className) static id _instance; \
+ (id)allocWithZone:(struct _NSZone *)zone{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
NSLog(@"%s", __FUNCTION__); \
_instance = [super allocWithZone:zone]; \
}); \
return _instance; \
} \
+ (id)shared##className{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
if (!_instance ) { \
_instance = [[self alloc ] init]; \
} \
}); \
return _instance; \
} \
- (oneway void)release{\
}\
- (NSUInteger)retainCount{ \
return 1; \
} \
- (id)autorelease{ \
return _instance; \
} \
- (id)retain{ \
return _instance; \
} \
+ (id)copyWithZone:(struct _NSZone *)zone{ \
return _instance; \
}
#endif