适用于ARC & MRC
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
OC 使用(arc)
直接复制到一个.h文件即可,例如singleton.h
使用方式:
1> 导入头文件 #import "singleton.h"
2> 在 .h 中 直接使用
SingletonH(methodName) -----> 类似于 + (instancetype)sharedmethodName 方法
3> 在.h 中直接使用
SingletonM(methodName) -----> 就相当于实现了
-
- + (instancetype)sharedmethodName
- + (id)allocWithZone:(struct _NSZone *)zone
- - (id)init
注意: 此种方式, shared 的方式 和 allock 的方式,都只会创建一个单例对象
时间: 2024-10-31 19:30:49