iOS開(kāi)發(fā)--單例的制定 使用

單例的使用以及制定

  1. 我們先來(lái)了解何為單利:
    單例模式是一種常用的軟件設(shè)計(jì)模式,通過(guò)單例模式可以保證系統(tǒng)中一個(gè)類(lèi)只有一個(gè)實(shí)例而且該實(shí)例易于外界訪問(wèn),從而方便對(duì)實(shí)例個(gè)數(shù)的控制并節(jié)約系統(tǒng)資源,如果希望系統(tǒng)中某個(gè)類(lèi)的對(duì)象只能存在一個(gè),單例模式是最好的解決方案。iOS中最常見(jiàn)的單例就是UIApplication。
  • 單利的應(yīng)用場(chǎng)景:
    音頻播放,背景音樂(lè)!硬件資源:加速器、[UIScreen mainScreen]
    sharedXX, mainXXX
  • 優(yōu)點(diǎn):可以阻止其他對(duì)象實(shí)例化單例對(duì)象的副本,從而確保所有對(duì)象都訪問(wèn)唯一實(shí)例
  • 缺點(diǎn):?jiǎn)卫龑?duì)象一旦建立,對(duì)象指針是保存在靜態(tài)區(qū)的,單例對(duì)象在堆中分配的內(nèi)存空間,會(huì)在應(yīng)用程序終止后才會(huì)被釋放
  • 溫馨提示:只有確實(shí)需要唯一使用的對(duì)象才需要考慮單例模式,不要濫用單例
  • 下邊說(shuō)下如何去創(chuàng)建一個(gè)單例:
    (1)重寫(xiě)allocWithZone,用dispatch_once實(shí)例化一個(gè)靜態(tài)變量
    (2) 寫(xiě)一個(gè)+sharedXXX方便其他類(lèi)調(diào)用 ,在iOS中,所有對(duì)象的內(nèi)存空間的分配,最終都會(huì)調(diào)用allocWithZone方法,如果要做單例,需要重寫(xiě)此方法。
  • 下邊是代碼示例:
 + (id)allocWithZone:(struct _NSZone *)zone{  
// dispatch_once是線程安全onceToken默認(rèn)為0  
    static sharedObj * instance;
   static dispatch_once_t onceToken;   
// dispatch_once宏可以保證塊代碼中的指令只被執(zhí)行一次   
   dispatch_once(&onceToken, ^{      
// 在多線程環(huán)境下,永遠(yuǎn)只會(huì)被執(zhí)行一次,instance只會(huì)被實(shí)例化一次        
  instance = [super allocWithZone:zone];   
 });     
  return instance;
}
  • 下邊這個(gè)方法是在外部要調(diào)用的,所以要在.h文件做聲明
 + (instancetype)sharedInstance{
 // 如果有兩個(gè)線程同時(shí)實(shí)例化,很有可能創(chuàng)建出兩個(gè)實(shí)例來(lái)  
  return [[self alloc] init];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容