单例头文件

 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
原文地址:https://www.cnblogs.com/ndyBlog/p/3995774.html