單例是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