iOS開發之自訂一個單例,iOS開發之自訂
iOS開發之自訂一個單例
這裡我使用宏:
// .h
#define single_interface(class) + (class *)shared##class;
// .m
// \ 代表下一行也屬於宏
// ## 是分隔字元
- #define single_implementation(class) \
- static class *_instance; \
- \
- + (class *)shared##class \
- { \
- if (_instance == nil) { \
- _instance = [[self alloc] init]; \
- } \
- return _instance; \
- } \
- \
- + (id)allocWithZone:(NSZone *)zone \
- { \
- static dispatch_once_t onceToken; \
- dispatch_once(&onceToken, ^{ \
- _instance = [super allocWithZone:zone]; \
- }); \
- return _instance; \
- }
當然還有其他更全面的方法,但是上面喝上嗎的原理都是一樣的,平時使用的實用用上面的就可以。
//單例模式在ARC\MRC環境下的寫法有所不同,需要編寫2套不同的代碼
#if __has_feature(objc_arc)
//ARC
//重寫allocWithZone:方法,在這裡建立唯一的執行個體(注意安全執行緒)
- + (id)allocWithZone:(struct _NSZone *)zone
- {
- @synchronized(self) {
- if (!_instance) {
- _instance = [super allocWithZone:zone];
- }
- }
- return _instance;
- }
- //提供1個類方法讓外界訪問唯一的執行個體
- + (instancetype)shareInstance
- {
- @synchronized(self) {
- if (!_instance) {
- _instance = [[self alloc] init];
- }
- }
- return _instance;
- }
- //實現copyWithZone:方法
- + (id)copyWithZone:(struct _NSZone *)zone
- {
- return _instance;
- }
#else
//非ARC
//非ARC中(MRC),單例模式的實現(比ARC多了幾個步驟)
//重寫allocWithZone:方法,在這裡建立唯一的執行個體(注意安全執行緒)
- + (id)allocWithZone:(struct _NSZone *)zone
- { @synchronized(self) {
- if (!_instance) {
- _instance = [super allocWithZone:zone];
- }
- }
- return _instance;
- }
- //提供1個類方法讓外界訪問唯一的執行個體
- + (instancetype)shareInstance
- {
- @synchronized(self) {
- if (!_instance) {
- _instance = [[self alloc] init];
- }
- }
- return _instance;
- }
- //實現copyWithZone:方法
- + (id)copyWithZone:(struct _NSZone *)zone
- {
- return _instance;
- }
- //實現記憶體管理方法
- - (id)retain
- {
- return self;
- }
- - (NSUInteger)retainCount
- {
- return 1;
- }
-
- - (oneway void)release
- {
- }
-
- - (id)autorelease
- {
- return self;
- }
#endif