一、單例簡介
單例模式是在軟體開發中經常用的一種模式。單例模式通俗的理解是,在整個軟體生命週期內,一個類只能有一個例項物件存在。
二、遇到的問題
在平時開發使用單例的過程中,有時候會有這樣的需求,在使用者登入成功時,將使用者的資訊記錄在使用者資訊單例中,當使用者退出登入後,因為這個使用者單例的指標被靜態儲存器的靜態變數引用著,導致使用者單例不能釋放,直到程式退出或者殺死後,記憶體才能被釋放。那有沒有一種方法能夠在單例不需要的時候就釋放掉,而不要等到App結束呢?下面就介紹一種可以銷燬的單例。
三、程式碼
說的再多不如一句程式碼來的實在,直接上程式碼。
單例類如下所示:
SingletonTemplate.h檔案
#import <Foundation/Foundation.h> @interface SingletonTemplate : NSObject /*!**生成單例***/ + (instancetype)sharedSingletonTemplate; /*!**銷燬單例***/ + (void)destroyInstance; @end
SingletonTemplate.m檔案
static SingletonTemplate *_instance=nil; @implementation SingletonTemplate + (instancetype)sharedSingletonTemplate { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance=[[self alloc] init]; NSLog(@"%@:----建立了",NSStringFromSelector(_cmd)); }); return _instance; } + (instancetype)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [super allocWithZone:zone]; }); return _instance; } + (void)destroyInstance { _instance=nil; } - (id)copyWithZone:(NSZone *)zone { return _instance; } - (void)dealloc { NSLog(@"%@:----釋放了",NSStringFromSelector(_cmd)); }
四、程式碼介紹
關於程式碼.h檔案中有兩個方法,一個是生成單例,另一個是銷燬單例;其中銷燬單例方法,是將靜態儲存區的靜態變數指標置為nil,這樣單例物件在沒有任何指標指向的情況下被系統回收了。
執行程式,列印的結果如下
- (void)viewDidLoad { [super viewDidLoad]; [SingletonTemplate sharedSingletonTemplate]; sleep(2); [SingletonTemplate destroyInstance]; } 列印結果: 2017-02-27 22:42:33.915 MyTestWorkProduct[3550:78078] sharedSingletonTemplate:----建立了 2017-02-27 22:42:35.990 MyTestWorkProduct[3550:78078] dealloc:----釋放了