1躏结、單例宏定義源碼
/**
* 獲取單例
*
*/
#define SINGLE(class) [class sharedInstance]
/**
* 在.h文件中定義的宏
* @return 單例
*/
#define SINGLE_INT +(instancetype)sharedInstance;
/**
* 在.m文件中執(zhí)行宏里面的方法
*
* @return 單例
*/
#define SINGLE_IMP \
static id _instance = nil;\
+ (instancetype)sharedInstance\
{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [[self alloc] init];\
});\
return _instance;\
\
}\
+ (instancetype)allocWithZone:(struct _NSZone *)zone\
{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [super allocWithZone:zone];\
});\
return _instance;\
}\
\
- (id)copyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
說明
此宏定義精華就是把聲明文件和執(zhí)行文件都放在宏定義了狰域,而且針對(duì)不同的類,生成不同的單例兆览,使用方法大概是在需要單例化類.h中定義SINGLE_INT塞关,然后在該類的@implementation 后面聲明SINGLE_IMP ,獲取單例則直接 [SINGLE(Person) do]抬探,具體如下
2帆赢、使用方法
這里使用Person類構(gòu)造單例
person.h
#import <Foundation/Foundation.h>
#import "SingleTon.h"
@interface Person : NSObject
- (void)do;
SINGLE_INT //這里代表shareInstance的聲明那一坨
@end
person.m
#import "Person.h"
@implementation Person
- (void)do
{
NSLog(@"1");
}
SINGLE_IMP //這里表示shareInstance執(zhí)行方法,allocWithzone,copyWithZone那幾坨
@end
ViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
Person *p1 = [Person sharedInstance];
Person *p2 = [p1 copy];
Person *p3 = [Person new];
NSLog(@"%@,%@,%@",p1,p2,p3);
[SINGLE(Person) do];
}