單例設計模式是在開發中經常可以看到的一種設計模式,不管是在 Cocoa Touch框架還是我們自己的業務邏輯中都可以看到它的身影。
- 首先解答一個問題,什么是單例設計模式呢?
它可以保證在我們的 App 里面某個類創建出來的對象有且僅有一個。
- 首先解答一個問題,什么是單例設計模式呢?
- 其次為什么要使用單例設計模式,直接創建對象不行么?
1)這個要從單例設計模式的作用說起,在手持設備當中,內存的使用很多情況下都是要斤斤計較,單例設計模式可以保證在我們的 App 里面某個類創建出來的對象有且僅有一個,那么它的一個作用就是可以節省內存開銷。
2)如果我們的 App 有一份數據,整個 App 到處都有可能使用到這份數據(比如登錄的用戶信息),只需要使用同一份數據(保證大家訪問的數據是相同的,一致的)。
3)工具類一般都可以設計成單例設計模式。
- 其次為什么要使用單例設計模式,直接創建對象不行么?
- 下面直接上代碼
#define JCSINGLETON_H(name) +(instancetype)share##name;
#if __has_feature(objc_arc)
//條件滿足 ARC
#define JCSINGLETON_M(name) static id _instance;\
\
+(instancetype)allocWithZone:(struct _NSZone *)zone\
{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [super allocWithZone:zone];\
});\
\
return _instance;\
}\
\
+(instancetype)share##name\
{\
return [[self alloc]init];\
}\
\
-(id)copyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
\
-(id)mutableCopyWithZone:(NSZone *)zone\
{\
return _instance;\
}
#else
//MRC
#define JCSINGLETON_M(name) static id _instance;\
+(instancetype)allocWithZone:(struct _NSZone *)zone\
{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [super allocWithZone:zone];\
});\
\
return _instance;\
}\
\
+(instancetype)share##name\
{\
return [[self alloc]init];\
}\
\
-(id)copyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
\
-(id)mutableCopyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
-(oneway void)release\
{\
}\
\
-(instancetype)retain\
{\
return _instance;\
}\
\
-(NSUInteger)retainCount\
{\
return MAXFLOAT;\
}
#endif