為啥突然想寫這篇文章呢? 最近在做藍牙的項目,假如你有一個藍牙的程序已經執行了, 你在其他類也想用到這個程序 ,你還不能有兩個藍牙程序 這怎么辦呢, 這就得想到 單例。
在開發中經常會用到單例設計模式,目的就是為了在程序的整個生命周期內,只會創建一個類的實例對象,而且只要程序不被殺死,該實例對象就不會被釋放。下面我們來看看單例的概念、用途、如何創建,以便加深理解。作用 在應用這個模式時,單例對象的類必須保證只有一個實例存在。許多時候整個系統只需要擁有一個的全局對象,這樣有利于我們協調系統整體的行為。比如在APP開發中我們可能在任何地方都要使用用戶的信息(想想你用過的NSUserDeafauts),那么可以在登錄的時候就把用戶信息存放在一個文件里面,這些配置數據由一個單例對象統一讀取,然后服務進程中的其他對象再通過這個單例對象獲取這些配置信息。這種方式簡化了在復雜環境下的配置管理。 單例之所以存在于整個應用程序,是因為他的指針存在于 靜態區 ,關于靜態區大家可以 看看內存分配的知識。
創建單例 單例的要求 是讓對象在程序里只創建一次 只創建一次的程序代碼 ,很容易讓我們想到 gcd 里面的 dispatch_once
GCD方式
static id _instance;+ (instancetype)allocWithZone:(struct _NSZone *)zone{static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{_instance = [super allocWithZone:zone];});return _instance;}+ (instancetype)sharedInstance{static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{_instance = [[self alloc] init];});return _instance;}- (id)copyWithZone:(NSZone *)zone{return _instance;}- (id)mutableCopyWithZone:(NSZone *)zone {return _instance;}來個老式的創建方式 舉一個蘋果官方文檔中的寫法。
static AccountManager *DefaultManager = nil; + (AccountManager *)defaultManager { if (!DefaultManager) DefaultManager = [[self allocWithZone:NULL] init]; return DefaultManager; }當要使用的時候 你想到單例 會解決你很多困擾,fighting!
新聞熱點
疑難解答