①定义
单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
②优缺点
优点:为频繁访问的第三方工具提供了唯一的实例,从而节约系统资源,不用再频繁地创建和销毁对象,无疑提高了系统的性能。
缺点:不可过多的创建单例,因为单例从创建后到彻底关闭程序前都会一直存在,如果过多的创建单例无疑浪费系统资源和影响系统效率。
③代码实现
创建一个对象是先调用alloc方法分配对象内存,再调用init方法进行初始化,那么实现单例,重写allocWithZone:方法就可以了,用GCD的dispatch_once函数是比较简单的一种方式,因为有一个dispatch_once_t类型参数能保证只执行一次。
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
static dispatch_once_t onceToken;
static id instance;
dispatch_once(&onceToken, ^{
instance = [super allocWithZone:zone];
});
return instance;
}
④宏定义单例模式
如果多个类要实现单例模式,我们可以定义个一个头文件SingletonPattern.h,里面定义两个宏,分别是声明与实现。
#ifndef SingletonPattern_h
#define SingletonPattern_h
#define WD_SINGLETON_PATTERN_INTERFACE(name) +(instancetype)shared##name;
#define WD_SINGLETON_PATTERN_IMPLEMENTATION(name) +(instancetype)shared##name {\
return [[self alloc] init];\
}\
+ (instancetype)allocWithZone:(struct _NSZone *)zone {\
static dispatch_once_t onceToken;\
static id instance;\
dispatch_once(&onceToken, ^{\
instance = [super allocWithZone:zone];\
});\
return instance;\
}\
//- (id)copyWithZone:(NSZone *)zone {\
//return self;\
//}
#endif
实现单例,只要导入头文件"SingletonPattern.h"
,
在.h文件写WD_SINGLETON_PATTERN_INTERFACE(类名)
,
在.m文件写WD_SINGLETON_PATTERN_IMPLEMENTATION(类名)
,就可以了。
网友评论