首页 > 代码库 > 单例模式

单例模式

单例模式
单例模式的作用
可以保证程序运行过程,一个类只有一个实例,而且该实例易于供外界访问。
从而方便的控制了实例个数,节约了系统资源。

单例模式的使用场合
在整个应用程序中,共享一份资源(这份资源只需要创建初始化一次)。

单例模式在ARC/MRC环境下的写法有所不同,需要编写两套不同的代码。
可以用宏判断是否为ARC环境

#if __has_feature(objc_arc)
//ARC
#else
//MRC
#endif

单例模式 - ARC
ARC中,单例模式的实现
在.m中保留一个全局的static的实例
static  id  _instance;

重写allocWithZone:方法,在这里创建唯一的实例(注意线程安全)
+ (id)allocWithZone:(struct  _NSZone  *)zone
{
         static  dispatch_once_t  onceToken;
        dispatch_once(&onceToken,  ^{
            _instance  =  [super  allocWithZone:zone];
});
        return  _instance;
}
提供一个类方法让外界访问唯一的实例
+ (instancetype)shareAudioTool
{
        static  dispatch_once_t  onceToken;
        dispatch_once(&onceToken,  ^{
        _instance  =  [[CZAudioTool  alloc] init];
});
        return  _instance;
}
//实现copyWithZone:方法
- (id)copyWithZone:(NSZone  *)zone
{
        return _instance;
}

单例模式-非ARC
非ARC(MRC),单例模式的实现比ARC模式下多了几个步骤
实现内存管理方法
- (id)retain{ return  self;}
- (NSUInteger)retainCount{  return  UINT_MAX;}
- (oneway  void)release{}
- (id)autorelease {return  self;}

 

如何通过宏定义定义单例

/** MRC版本请粘贴以下代码  #if !__has_feature(objc_arc) - (oneway void)release {} - (id)retain { return _instance; } - (id)autorelease { return _instance; } - (NSUInteger)retainCount { return UINT_MAX; } #endif */// 接口定义#define singletonInterface(className)          + (instancetype)shared##className;// 实现定义// 在定义宏时 \ 可以用来拼接字符串#define singletonImplementation(className) static className *_instance; + (id)allocWithZone:(struct _NSZone *)zone {     static dispatch_once_t onceToken;     dispatch_once(&onceToken, ^{         _instance = [super allocWithZone:zone];     });     return _instance; } + (instancetype)shared##className {     static dispatch_once_t onceToken;     dispatch_once(&onceToken, ^{         _instance = [[self alloc] init];     });     return _instance; } - (id)copyWithZone:(NSZone *)zone {     return _instance; }

 

单例模式