一.单列模式简介
1.什么是单列模式?
a.通过static关键词,声明全局变量。在整个进程运行期间只会被赋值一次
b.单列模式是一种常用的设计模式,一个类只有一个实例对象,且该类提供了便宜访问的接口,创建的实例可以在程序中全局使用,用效的节约系统资源。
2.单例模式的作用
可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问
从而方便地控制了实例个数,并节约系统资源
3.单例模式的使用场合
在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次)
3.单例模式在ARC\MRC环境下的写法有所不同,需要编写2套不同的代码
可以用宏判断是否为ARC环境
#if __has_feature(objc_arc)
// ARC
#else
// MRC
#endif
二.单列模式的实现
1.ARC
a.GCD实现
// .h文件
#define TBBSingletonH + (instancetype)sharedInstance;
// .m文件
#define TBBSingletonM\
static id _instace; \
\
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instace = [super allocWithZone:zone]; \
}); \
return _instace; \
} \
\
+ (instancetype)sharedInstance \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instace = [[self alloc] init]; \
}); \
return _instace; \
} \
\
- (id)copyWithZone:(NSZone *)zone \
{ \
return _instace; \
}
使用方法:只有在想设计为单列的类中.ht和.m文件中分别加入TBBSingletonH和TBBSingletonM即可
b.非GCD单列
#import
@interface TBBStu :NSObject
+ (instancetype)sharedInstance;
@end
#import“TBBStu.h"
@interface TBBStu()
@end
@implementation TBBStu
staticid_instance;
+ (instancetype)allocWithZone:(struct_NSZone*)zone
{
@synchronized(self) {
if(_instance==nil) {
_instance= [superallocWithZone:zone];
}
}
return_instance;
}
+ (instancetype)sharedInstance
{
@synchronized(self) {
if(_instance==nil) {
_instance= [[self alloc]init];
}
}
return_instance;
}
- (id)copyWithZone:(NSZone*)zone
{
return_instance;
}
@end
2.非ARC
非ARC中(MRC),单例模式的实现(比ARC多了几个步骤)
实现内存管理方法
- (id)retain{returnself;}
- (NSUInteger)retainCount{return1; }
- (onewayvoid)release {}
- (id)autorelease{returnself; }
实现代码:
//.h文件
#import
//单例方法
@interface TBBSingleton : NSObject
+ (instancetype)sharedSingleton;
@end
//.m文件
#import "TBBSingleton.h"
@implementation TBBSingleton
//全局变量
static id _instance = nil;
//单例方法
+(instancetype)sharedSingleton{
//系统的大多数类方法都有做autorelease,所以我们也需要做一下
return [[[self alloc] init] autorelease];
}
//alloc会调用allocWithZone:
+(instancetype)allocWithZone:(struct _NSZone *)zone{
//只进行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
//初始化方法
-(instancetype)init{
// 只进行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super init];
});
return _instance;
}
- (oneway void)release{
//什么都不做 保证单例对象不被销毁
}
//返回本身 保证只有一个单例对象
- (instancetype)retain{
return _instance;
}
//计数器为1 保证只有一个单例对象
- (NSUInteger)retainCount{
return 1;
}
//copy在底层 会调用copyWithZone:
+ (id)copyWithZone:(struct _NSZone *)zone{
return _instance;
}
- (id)copyWithZone:(NSZone *)zone{
return _instance;
}
+ (id)mutableCopyWithZone:(struct _NSZone *)zone{
return _instance;
}
- (id)mutableCopyWithZone:(NSZone *)zone{
return _instance;
}
@end
注意:因为要保证单例对象在程序运行期间一直存在,所以不需要实现release方法和dealloc方法