單例模式簡單又經常被面試提到,所以放在第一位置。
什麼是單例模式?
單例,字面意思就是整個應用只能建立或存在一個執行個體。
為什麼需要單例模式?
1,整個應用程式只能有一個執行個體。例如:UIApplication類:當應用程式啟動時,應用的狀態由UIApplication類的一個執行個體維護,這個執行個體代表了整個“應用程式物件”,實現應用程式中的一些共用資源的訪問和狀態的保持等。
2,在iOS應用整個生命週期中,只需要一個執行個體。例如:UIAccelerometer類:即時獲得重力加速計資料,保持x,y,z軸的狀態。這個執行個體只需要一個執行個體,多個執行個體完全沒有意義(一台裝置還能產生2個加速度?),只會佔用記憶體。
...
單例模式的實現原理?
怎麼保持怎有一個執行個體呢?
首先我們會想到,1,用個if語句判斷類是否已經被執行個體化。如果未被執行個體化,則執行個體化。否則直接返回。2,如果單例對象由多個線程訪問呢?所有安全執行緒至關重要。
單例模式一般會封裝一個靜態屬性,並提供靜態執行個體的建立方法。
下面先用GCD實現:
建立一個Singleton類:
Singleton.h:聲明一個靜態屬性,並提供靜態執行個體的建立方法。
@interface Singleton : NSObject@property (nonatomic,strong) NSString *singletonData;+(Singleton *)sharedManager;@end
Singleton.m
@implementation Singleton@synthesize singletonData=_singletonData; //預設static Singleton *sharedManager=nil;+(Singleton *)sharedManager{ static dispatch_once_t once; dispatch_once(&once, ^{ sharedManager=[[Singleton alloc] init]; }); return sharedManager;}@end
dispatch_once函數:代碼只會被運行一次,而且還是線程同步的。所以這裡也不需要使用@synchronized。
GCD是基於C語言的多線程訪問技術。比較簡單又很重要,不熟悉的可以先熟悉下。格式其實也不需要過多記憶,Xcode提供的代碼模版也有。
單例模式在iOS中的應用
1,UIApplication
2,UIAccelerometer
3,NSUserDefaults:讀取應用程式設定項目。
4,NSNotificaionCenter:提供資訊廣播通知。
5,NSFileManager:提供訪問檔案系統的通用操作,可以定位、建立、複製檔案和檔案夾。
6,NSBundle:提供動態載入(或卸載)可執行代碼、定位資源檔以及資源本地化、訪問檔案系統等。