Objective-C中的單例模式(工具類)

單例是iOS開發中常常會用到的一種設計模式,顧名思義,即建立一個類,該類在整個程序的生命週期中只有一個實例對象,不管是經過new,alloc init,copy等方法建立,或者建立多少個對象,自始至終在內存中只會開闢一塊空間,直到程序結束,由系統釋放.設計模式

以下圖用不一樣的方式建立6個對象,但經過打印其內存地址,咱們能夠發現它們是共享同一塊內存空間的.工具

 

因爲在平時開發中常常用到,因此我將建立單例的方法定義成宏,並封裝成一個工具類,提供了一個類方法來快速建立1個單例對象;學習

而且此類的單例包括了在MRC模式下的建立方式,保證了在MRC模式下,仍能使用該工具類來快速建立1個單例對象;spa

該工具類使用很是方便,只需在須要用到的類中導入頭文件便可,如下是實現代碼:設計

 1 //
 2 //  YYSharedModelTool.h
 3 //  SharedModel
 4 //
 5 //  Created by Arvin on 15/12/21.
 6 //  Copyright © 2015年 Arvin. All rights reserved.
 7 //
 8 
 9 #ifndef YYSharedModelTool_h
10 #define YYSharedModelTool_h
11 
12 // .h 文件
13 // ##: 在宏中,表示拼接先後字符串
14 #define YYSharedModelTool_H(className) + (instancetype)shared##className;
15 
16 #if __has_feature(objc_arc) // ARC 環境
17 
18 // .m 文件
19 #define YYSharedModelTool_M(className)\
20     /****ARC 環境下實現單例的方法****/\
21     + (instancetype)shared##className {\
22         return [[self alloc] init];\
23     }\
24     \
25     - (id)copyWithZone:(nullable NSZone *)zone {\
26         return self;\
27     }\
28     \
29     + (instancetype)allocWithZone:(struct _NSZone *)zone {\
30         static id instance;\
31         static dispatch_once_t onceToken;\
32         dispatch_once(&onceToken, ^{\
33             instance = [super allocWithZone:zone];\
34         });\
35         return instance;\
36     }
37 
38 #else // MRC 環境
39 
40 // .m 文件
41 #define YYSharedModelTool_M(className)\
42     \
43     + (instancetype)shared##className {\
44         return [[self alloc] init];\
45     }\
46     \
47     - (id)copyWithZone:(nullable NSZone *)zone {\
48         return self;\
49     }\
50     \
51     + (instancetype)allocWithZone:(struct _NSZone *)zone {\
52         static id instance;\
53         static dispatch_once_t onceToken;\
54         dispatch_once(&onceToken, ^{\
55             instance = [super allocWithZone:zone];\
56         });\
57         return instance;\
58     }\
59     /****MRC 環境須要重寫下面3個方法****/\
60     - (oneway void)release {\
61     \
62     }\
63     - (instancetype)retain {\
64         return self;\
65     }\
66     - (instancetype)autorelease {\
67         return self;\
68     }
69 
70 #endif
71 
72 #endif /* YYSharedModelTool_h */

END! 歡迎留言交流,一塊兒學習...code

相關文章
相關標籤/搜索