1、概述面試
單例模式是一種經常使用的軟件設計模式,經過單例模式能夠保證系統中一個類只有一個實例並且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。設計模式
若是但願系統中某個類的對象只能存在一個,單例模式是最好的解決方案,iOS中最多見的單例就是UIApplication 。安全
應用場景:多線程
音頻播放,背景音樂!spa
硬件資源:加速器、[UIScreen mainScreen]線程
通常都是經過sharedXX, mainXXX去得到這個單例對象。設計
常見面試題:手寫單例指針
優勢:對象
能夠阻止其餘對象實例化單例對象的副本,從而確保全部對象都訪問惟一實例內存
缺點:
單例對象一旦創建,對象指針是保存在靜態區的,單例對象在堆中分配的內存空間,會在應用程序終止後纔會被釋放
2、單例的實現步驟
第一步:重寫allocWithZone方法
allocWithZone方法是對象分配內存空間時,最終會調用的方法,重寫該方法,保證只會分配一個內存空間
+ (id)allocWithZone:(struct _NSZone *)zone
{
static Ticket *instance;
static dispatch_once_t onceToken;//用來檢測是否只被執行一次
//dispatch_once是線程安全的,可以作到在多線程的環境下Block中的代碼只會被執行一次
dispatch_once(&onceToken, ^{
instance = [super allocWithZone:zone];
});
return instance;
}
第二步:創建sharedXXX類方法,便於其餘類訪問
+ (instancetype)sharedTicket
{
return [[self alloc] init];
}