建立單例必須注意的3個要點:
一是某個類只能有乙個例項
二是它必須自行建立這個例項
三是它必須自行向整個系統提供這個例項
使用單例(singleton)的2個優點:
1.例項控制:singleton 會阻止其他物件例項化其自己的 singleton 物件的副本,從而確保所有物件都訪問唯一例項。
2.靈活性:因為類控制了例項化過程,所以類可以更加靈活修改例項化過程
————————-方法1(別用)————————
01 首先建立乙個繼承於nsobject的乙個單例類,這裡以 instance.h為例。
具體的講解都在**注釋中,不一一瞎比比了:
在instance.h檔案中
#import
@inte***ce
instance : nsobject
//宣告乙個單例類方法
+ (id)sharedinstance;
@end
02 在 instance.m 檔案中:
#import "instance.h"
@implementation
instance
//定義靜態全域性變數
static instance *instance = nil;
//單例類方法實現
+ (id)sharedinstance
//返回例項
return instance;
}@end
這樣乙個簡單的單例就完成了,但是,為了說一下為何不推薦這個方法,我們接著在控制器 viewcontroller.m檔案中演示一下。
03 在 viewcontroller.m 中
#import "viewcontroller.h"
#import "instance.h"
@inte***ce
viewcontroller ()
@end
@implementation
viewcontroller
- (void)viewdidload
@end
列印結果:
從列印結果可以發現:單例1和單例2的列印位址一樣,而單例3的位址不同,原因是什麼呢?很簡單,第3中的單例物件獲取的方式是重新建立了乙個單例例項,也就是說系統又alloc了一塊記憶體空間。而真正的獲取乙個單例例項我們通常用的是[instance sharedinstance],並且單例只能有乙個例項物件。當然,既然存在問題,那必然有解決的辦法,所以為了防止使用者有時獲取單例不慎採用了alloc的方法,這裡推薦相當好的乙個單例建立方法,看下面。
———————-方法2(正確的單例建立寫法)—————————–
04 同樣,在instance.h檔案中
#import
@inte***ce
instance : nsobject
//宣告乙個單例類方法
+ (id)sharedinstance;
@end
05 在 instance.m 檔案中:
#import "instance.h"
@implementation
instance
//定義靜態全域性變數
static instance *instance = nil;
//單例的建立方法2
//多執行緒建立單例(推薦使用)
+ (id)sharedinstance );
//返回單例例項
return instance;
}//防止外部呼叫alloc,複寫系統自帶的alloc方法
+ (instancetype)allocwithzone:(struct _nszone *)zone
@end
注:為了防止使用者使用關鍵字copy導致單例不唯一,還需要重寫:copywithzone方法!!!06 在 viewcontroller.m 中,同03,這裡就不寫了,重點看一下列印結果:
顯然,儘管在控制器中的列印內容和方法1中的一樣,但列印結果卻是不同,這裡列印的三種結果中的位址相同,也就是說獲取到的是同乙個單例例項物件。所以,為了防止使用者使用 instance *instance3 = [[instance alloc] init]; 這樣的alloc建立獲取單例例項物件方法,推薦使用方法2多執行緒建立單例. 當然,網上還有很多建立單例的方法,大家可以嘗試比較一下哪種更好。
Java設計模式 單例模式(single)
目錄目的 應用例項 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。菜鳥教程 乙個國家有乙個首都 windows 是多程序多執行緒的,在操作乙個檔案的時候,就不可避免地出現多個程序或執行緒同時操作乙個檔案的現象,所以所有檔案的處理必須通過唯一的例項來進行。第一種 package com.ga...
java單例模式的正確寫法
一 懶漢式 執行緒不安全 public class singleton public static singleton getinstance return instance 介紹 執行緒不安全,在多執行緒情況下容易建立多個例項。二 懶漢式 執行緒安全 public static synchroni...
dispatch once建立單例
無論是愛還是恨,你都需要單例。實際上每個ios或mac os應用都至少會有 什麼是單例呢?wikipedia是如此定義的 在軟體工程中,單例是一種用於實現單例的數學概念,即將類的例項化限制成僅乙個物件的設計模式。或者我的理解是 單例是一種類,該類只能例項化乙個物件。儘管這是單例的實際定義,但在fou...