码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式

时间:2014-10-21 19:12:31      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   ar   使用   strong   sp   div   

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

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

单例模式在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; }

 

单例模式

标签:style   blog   color   io   ar   使用   strong   sp   div   

原文地址:http://www.cnblogs.com/shaohuaios/p/4040977.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!