1、概念objective-c
單例模式是一種經常使用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例的特殊類。經過單例模式能夠保證系統中一個類只有一個實例並且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。若是但願在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。設計模式
通俗的說來:單例模式用於當一個類只能有一個實例的時候。多線程
1.單例模式須要達到的目的:
• 封裝一個共享的資源
• 提供一個固定的實例建立方法
• 提供一個標準的實例訪問接口spa
2.單例模式的要點:線程
顯然單例模式的要點有三個;一是某個類只能有一個實例;二是它必須自行建立這個實例;三是它必須自行向整個系統提供這個實例。設計
3.單例模式的優勢:code
1.實例控制:Singleton 會阻止其餘對象實例化其本身的 Singleton 對象的副本,從而確保全部對象都訪問惟一實例。對象
2.靈活性:由於類控制了實例化過程,因此類能夠更加靈活修改實例化過程blog
1 @interface SingleInstance : NSObject 2 //定義一個類方法,返回當前對象的實例 3 + (instancetype) sharedInstance; 4 @end
②在.m文件中定義一個靜態的當前單例對象的實例,並賦值爲nil接口
1 static SingleInstance *instance = nil;
二、實現一個實例構造方法檢查上面聲明的靜態實例是否爲nil,若是是則新建並返回一個本類的實例
①第一種實現方法
1 //防止多線程同時執行,而建立多個對象 2 @synchronized(self) 3 { 4 //當前對象爲空 5 if (!instance) 6 { 7 instance = [[self alloc] init]; 8 } 9 10 return instance; 11 }
②第二種實現方法(推薦使用)
1 static dispatch_once_t onceToken; 2 dispatch_once(&onceToken, ^{ 3 instance = [[self alloc] init]; 4 }); 5 6 return instance;
三、重寫allocWithZone方法,用來保證其餘人直接使用alloc和init試圖得到一個新實力的時候不產生一個新實例
1 //alloc會觸發,從新allocWithZone方法,防止經過alloc建立一個新的對象 2 + (instancetype)allocWithZone:(struct _NSZone *)zone 3 { 4 if (!instance) 5 { 6 instance = [super allocWithZone:zone]; 7 } 8 9 return instance; 10 }
四、適當實現allocWitheZone,copyWithZone,release和autorelease。
1 + (id)copyWithZone:(struct _NSZone *)zone 2 { 3 return self; 4 } 5 6 + (id)mutableCopyWithZone:(struct _NSZone *)zone 7 { 8 return self; 9 } 10 11 - (instancetype)retain 12 { 13 return self; 14 } 15 16 - (oneway void)release 17 { 18 19 } 20 21 - (instancetype)autorelease 22 { 23 return self; 24 } 25 26 - (NSUInteger)retainCount 27 { 28 return MAXFLOAT; 29 }