单例设计模式是开发中经常会被用到的一种设计模式,而且有时候一个项目中会用到多个不同的单例,但是重复的编写创建单例的代码就会显得比较麻烦。如果我们将创建单例的代码以宏的形式定义出来,只需要简单的两句就能实现单例的声明和实现,就可以很容易的避免上面的麻烦.下面讲一下怎么实现宏定义单例.
步骤一
我们先创建一个头文件,将下面的代码声明到这个头文件中:
//声明单例实现入口
#define Singleton_InterFace(singletonName) \
+ (id)shared##singletonName;
//创建单例实现方法
#define Singleton_Implemention(singletonName) \
static id _singletonInstance = nil; \
+ (id)shared##singletonName \
{ \
return [[self alloc] init]; \
} \
+ (id)allocWithZone:(NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_singletonInstance = [super allocWithZone:zone]; \
}); \
return _singletonInstance; \
} \
- (id)copyWithZone:(NSZone *)zone { \
return _singletonInstance; \
} \
- (id)mutableCopyWithZone:(NSZone *)zone \
{ \
return self; \
} \
步骤二
按照步骤一将单例的实现方法以宏的方式定义出来,下面就调用声明好的宏方法:
1.在.h中调用Singleton_InterFace(DataBaseManager);
#import <Foundation/Foundation.h>
#import "xxx.h"//定义宏单例的头文件
@interface HYDataBaseManager : NSObject<NSCopying, NSMutableCopying>
Singleton_InterFace(DataBaseManager);
@end
2.在.m中调用Singleton_Implemention(DataBaseManager);
#import "HYDataBaseManager.h"
@implementation HYDataBaseManager
Singleton_Implemention(DataBaseManager);
@end
步骤三
上面两步以及完成后,接下来我们就来验证一下单例是否正的能创建成功:
//调用下面的方法
- (void)singletonTest {
HYDataBaseManager *dataBaseManager1 = [HYDataBaseManager shareDataBaseManager];
HYDataBaseManager *dataBaseManager2 = [HYDataBaseManager shareDataBaseManager];
NSLog(@"Manager1 == %@", dataBaseManager1);
NSLog(@"Manager2 == %@", dataBaseManager2);
}
打印输出:
2017-11-28 10:49:39.070465+0800 GCD[1670:75187] Manager1 == <HYDataBaseManager: 0x604000017790>
2017-11-28 10:49:39.070701+0800 GCD[1670:75187] Manager2 == <HYDataBaseManager: 0x604000017790>
从控制台的输出可以看出Manager1和Manager2是同一个对象,所以单例创建成功.
引申: 系统提供的单例设计模式大都是以shared开头,那么我们的写法应该遵循系统的这种命名规范,##就是一个连接符,会将singletonName变量的值拼接在shared后面形成一个方法名,每行末尾的"\"也是C语音的一个连接符.注意,每行之间不能用空行,否则编译的时候会报错,若果需要空行,需要在空行处添加"\"。
网友评论