單例模式 是一個類在系統中只有一個實例對象。經過全局的一個入口點對這個實例對象進行訪問。在iOS開發中,單例模式是很是有用的一種設計模式。設計模式
能夠保證在程序運行過程,一個類只有一個實例工具
實現單例模式有三個條件:學習
類的構造方法是私有的spa
類提供一個類方法用於產生對象設計
類中有一個私有的本身對象code
針對於這三個條件,OC中都是能夠作到的對象
類的構造方法是私有的
咱們只須要重寫allocWithZone方法,讓初始化操做只執行一次繼承
類提供一個類方法產生對象
這個能夠直接定義一個類方法內存
類中有一個私有的本身對象
咱們能夠在.m文件中定義一個屬性便可資源
應用場景
某個類常常被使用(節約系統資源)
定義工具類
共享數據
注意點
不要繼承單例類
先建立子類永遠是子類對象
先建立父類永遠是父類對象
單例模式:
懶漢模式 : 第一次用到單例對象的時候再建立
餓漢模式 : 一進入程序就建立一個單例對象
#import "Singleton.h" @implementation Singleton static id _instance; /** * alloc方法內部會調用這個方法 */ + (instancetype)allocWithZone:(struct _NSZone *)zone{ if (_instance == nil) { // 防止頻繁加鎖 @synchronized(self) { if (_instance == nil) { // 防止建立屢次 _instance = [super allocWithZone:zone]; } } } return _instance; } + (instancetype)sharedSingleton{ if (_instance == nil) { // 防止頻繁加鎖 @synchronized(self) { if (_instance == nil) { // 防止建立屢次 _instance = [[self alloc] init]; } } } return _instance; } - (id)copyWithZone:(NSZone *)zone{ return _instance; } @end
#import "HMSingleton.h" @implementation Singleton static id _instance; /** * 當類加載到OC運行時環境中(內存),就會調用一次(一個類只會加載1次) */ + (void)load{ _instance = [[self alloc] init]; } + (instancetype)allocWithZone:(struct _NSZone *)zone{ if (_instance == nil) { // 防止建立屢次 _instance = [super allocWithZone:zone]; } return _instance; } + (instancetype)sharedSingleton{ return _instance; } - (id)copyWithZone:(NSZone *)zone{ return _instance; } @end
@implementation Singleton static id _instance; + (instancetype)allocWithZone:(struct _NSZone *)zone{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [super allocWithZone:zone]; }); return _instance; } + (instancetype)sharedSingleton{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [[self alloc] init]; }); return _instance; } - (id)copyWithZone:(NSZone *)zone{ return _instance; } @end
在非ARC的環境下,須要再加上下面的方法:
重寫release方法爲空
重寫retain方法返回本身
重寫retainCount返回1
重寫autorelease返回本身
- (oneway void)release { } - (id)retain { return self; } - (NSUInteger)retainCount { return 1;} - (id)autorelease { return self;}
如何判斷是不是ARC
#if __has_feature(objc_arc) //ARC環境 #else //MRC環境 #endif
更多關於iOS學習開發的文章請登錄個人我的博客www.zhunjiee.com,歡迎前來參觀學習