什麼是單例,爲何須要單例?函數
單例模式的做用就是解決「應用中只須要一個實例」的問題。spa
當咱們須要一個類,而不太關注這個「類」自己的時候,例如iOS設備都有一個重力類UIAccelerometer,其實對於用戶,只須要這個類的某些方法,好比實時獲取數據,獲取x,y,z軸的狀態等。因此這個類只須要一個實例就夠了,更多的實例只會佔用更多的內存空間而已。code
實際應用中的單例對象
首先在我接觸到的公司項目中,使用到的一個單例狀況就是記錄全部NSUserDefaults信息的單例PCSetting。NSUserDefaults自己就是一個單例,是iOS提供的輕量級數據持久化保存的類。blog
對於一個單例的建立,咱們須要:繼承
1.建立一個繼承於NSObject的類,而且在.h中聲明一個類方法生命週期
@interface PCSettings : NSObject + (PCSettings*)sharedSettings;
2.在.m文件中分別建立一個靜態變量,實現sharedSettings方法,以及重寫init方法事件
static PCSettings *g_sharedSettings = nil; + (PCSettings *)sharedSettings { if (g_sharedSettings == nil) { g_sharedSettings = [[PCSettings alloc] init]; } return g_sharedSettings; } - (id)init { self = [super init]; if (self != nil) { NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; hub_userId = [[prefs objectForKey:KEY_HubUserID] copy]; . . . } return self; }
如此就完成了一個單例的建立啦。內存
另外一種經過GCD建立單例的方法資源
+ (PCSettings *)sharedSettings { static dispatch_once_t once; dispatch_once(&once, ^{ g_sharedSettings = [[self alloc]init]; } return g_sharedSettings; }
在上述代碼中,dispatch_once函數就是由GCD提供的,它的做用是在整個應用程序生命週期中只執行一次代碼塊中的內容。dispatch_once可以記錄該代碼塊是否被調用過。
Objective-C語法中的其餘單例類
1.UIApplication
此類經過應用程序委託對象來響應低內存,應用啓動,後臺運行和應用終止等事件。
+ sharedApplication 建立
2.NSUserDefaults
輕量級數據存儲類
+ standardUserDefaults 建立
3.NSNotificationCenter
採用觀察者模式的通知機制
+ defaultCenter 建立
4.NSFileManager
提供了訪問文件系統的通用操做,能夠定位,建立,複製文件和文件夾
+ defaultManager 建立
5.NSBundle
操做本地資源,訪問文件系統等功能
+ mainBundle 建立