参考文章:
1、http://beyondvincent.com/blog/2013/05/09/20/
2、《ios设计模式解析》
iOS中,单例模式的实现方式一般有两种:Non-ARC(非ARC)和ARC+GCD (建议采用ARC+GCD模式)
(一)Non-ARC实现方法如下:
SYWNonARCSingleton.h
#import <Foundation/Foundation.h>
@interface SYWNonARCSingleton : NSObject
+(SYWNonARCSingleton *)sharedInstance;
@end
SYWNonARCSingleton.m
/**
参考文档:1、Cocoa Fundamentals Guide
2、 http://beyondvincent.com/blog/2013/05/09/20/
*/
#import "SYWNonARCSingleton.h"
@implementation SYWNonARCSingleton
static SYWNonARCSingleton *sharedInstance = nil;
/** 版本1
功能:获取一个sharedInstance实例,如果有必要的话,实例化一个
说明:这种非ARC实现单例的方法,不是线程安全的。因为,如果有多个线程同时调用sharedInstance,而sharedInstance方法需要花费1-2秒钟的时间,
那么,SYWNonARCSingleton的init方法可能会被多次调用,即,不同的线程获得的SYWNonARCSingleton实例可能不是同一个。解决方法:使用@synchronized来创建互斥锁
*/
/**
+(SYWNonARCSingleton *)sharedInstance
{
if (sharedInstance == nil) {
sharedInstance = [[super allocWithZone:NULL] init];
}
return sharedInstance;
}
*/
/** 版本2
功能:获取一个SYWNonARCSingleton的实例
*/
+(SYWNonARCSingleton *)sharedInstance
{
//保证在实例化的时候是线程安全的,但,不能保证,单例中所有方法的调用都是线程安全的。
@synchronized(self){
if (sharedInstance == nil) {
sharedInstance = [[super allocWithZone:NULL] init];
}
}
return sharedInstance;
}
/**版本3
说明:这个版本,在子类化单例的时候,应该最有效。
*/
/**
+(SYWNonARCSingleton *)sharedInstance
{
@synchronized(self){
if (sharedInstance == nil) {
sharedInstance = [NSAllocateObject([self class], 0, NULL) init];
}
}
return sharedInstance;
}
*/
- (id)init
{
self = [super init];
if (self) {
//通常在这里做一些相关的初始化任务
}
return self;
}
//这个dealloc方法不会被调用,以为,在程序的生命周期内,该单例一直都存在
- (void)dealloc
{
[super dealloc];
}
//通过返回当前的sharedInstance实例,就能防止实例化一个新的对象
+(id)allocWithZone:(struct _NSZone *)zone
{
return [[self sharedInstance] retain];
}
//不希望生成单例的多个拷贝
+(id)copyWithZone:(struct _NSZone *)zone
{
return self;
}
- (id)copy
{
return self;
}
- (id)retain
{
return self;
}
- (NSUInteger)retainCount
{
return NSUIntegerMax;
}
//该方法是空的,因为,不希望用户release掉这个对象
- (oneway void)release
{
}
- (id)autorelease
{
return self;
}
@end
SYWARCSingleton.h
#import <Foundation/Foundation.h>
@interface SYWARCSingleton : NSObject
+(SYWARCSingleton *)sharedInstance;
@end
SYWARCSingleton.m
#define DEFINE_SHARED_INSTANCE_USING_BLOCK(block)\
static dispatch_once_t onceToken = 0;\
__strong static id sharedInstance = nil;\
dispatch_once(&onceToken,^{\
sharedInstance = block();\
});\
return sharedInstance;\
#import "SYWARCSingleton.h"
@implementation SYWARCSingleton
+(SYWARCSingleton *)sharedInstance
{
static SYWARCSingleton *sharedInstance = nil;
static dispatch_once_t onceToken;//锁
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
//在ARC中,不用GCD也可以做到线程安全,即,使用@synchronized
/**
+(SYWARCSingleton *)sharedInstance
{
static SYWARCSingleton *sharedInstance = nil;
@synchronized(self){
sharedInstance = [[self alloc] init];
}
return sharedInstance;
}
*/
- (id)init
{
self = [super init];
if (self) {
//通常在这里做一些相关的初始化任务
}
return self;
}
@end