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