单例模式

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

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

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

 

posted @ 2014-10-21 18:02  对酒狂歌吃馍  阅读(182)  评论(0编辑  收藏  举报