1 // 帮助实现单例设计模式
2
3 // .h文件的实现
4 #define SingletonH(methodName) + (instancetype)shared##methodName;
5
6 // .m文件的实现
7 #if __has_feature(objc_arc) // 是ARC
8 #define SingletonM(methodName)
9 static id _instace = nil;
10 + (id)allocWithZone:(struct _NSZone *)zone
11 {
12 if (_instace == nil) {
13 static dispatch_once_t onceToken;
14 dispatch_once(&onceToken, ^{
15 _instace = [super allocWithZone:zone];
16 });
17 }
18 return _instace;
19 }
20
21 - (id)init
22 {
23 static dispatch_once_t onceToken;
24 dispatch_once(&onceToken, ^{
25 _instace = [super init];
26 });
27 return _instace;
28 }
29
30 + (instancetype)shared##methodName
31 {
32 return [[self alloc] init];
33 }
34 + (id)copyWithZone:(struct _NSZone *)zone
35 {
36 return _instace;
37 }
38
39 + (id)mutableCopyWithZone:(struct _NSZone *)zone
40 {
41 return _instace;
42 }
43
44 #else // 不是ARC
45
46 #define SingletonM(methodName)
47 static id _instace = nil;
48 + (id)allocWithZone:(struct _NSZone *)zone
49 {
50 if (_instace == nil) {
51 static dispatch_once_t onceToken;
52 dispatch_once(&onceToken, ^{
53 _instace = [super allocWithZone:zone];
54 });
55 }
56 return _instace;
57 }
58
59 - (id)init
60 {
61 static dispatch_once_t onceToken;
62 dispatch_once(&onceToken, ^{
63 _instace = [super init];
64 });
65 return _instace;
66 }
67
68 + (instancetype)shared##methodName
69 {
70 return [[self alloc] init];
71 }
72
73 - (oneway void)release
74 {
75
76 }
77
78 - (id)retain
79 {
80 return self;
81 }
82
83 - (NSUInteger)retainCount
84 {
85 return 1;
86 }
87 + (id)copyWithZone:(struct _NSZone *)zone
88 {
89 return _instace;
90 }
91
92 + (id)mutableCopyWithZone:(struct _NSZone *)zone
93 {
94 return _instace;
95 }
96
97 #endif