iOS – 單例模式寫一次就夠了

來源:互聯網
上載者:User

標籤:min   mini   mac   log   音樂播放   因此   問題   應用   調用   

一. 單例模式簡介

  1. 單例模式的作用
    可以保證在程式運行過程,一個類只有一個執行個體,而且該執行個體易於供外界訪問
    從而方便地控制了執行個體個數,並節約系統資源
  2. 單例模式的使用場合
    在整個應用程式中,共用一份資源(這份資源只需要建立初始化1次),一般用於工具類。例如:登陸控制器,網路資料請求,音樂播放器等一個工程需要使用多次的控制器或方法。
  3. 單例模式的優缺點
    優點:
    單例模式可以保證系統中一個類只有一個執行個體而且該執行個體易於外界訪問,從而方便對執行個體個數的控制並節約系統資源。
    如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。
    單例模式因為類控制了執行個體化過程,所以類可以更加靈活修改執行個體化過程。

    缺點:
    單例對象一旦建立,對象指標是儲存在靜態區的,單例對象在堆中分配的記憶體空間,會在應用程式終止後才會被釋放。
    單例類無法繼承,因此很難進行類的擴充。
    單例不適用於變化的對象,如果同一類型的對象總是要在不同的用例情境發生變化,單例就會引起資料的錯誤,不能儲存彼此的狀態。

注意:我們在使用單例類之前,一定要考慮好單例類是否適合和類以後的擴充性,避免盲目濫用單例

二. 單例在ARC中的實現

ARC中單例實現步驟

1 在類的內部提供一個static修飾的全域變數
2 提供一個類方法,方便外界訪問
3 重寫+allocWithZone方法,保證永遠都只為單例對象分配一次記憶體空間
4 嚴謹起見,重寫-copyWithZone方法和-MutableCopyWithZone方法

ARC中單例代碼實現

 

#import "Tools.h" @implementation Tools// 建立靜態對象 防止外部存取static Tools *_instance;+(instancetype)allocWithZone:(struct _NSZone *)zone{//    @synchronized (self) {//        // 為了防止多線程同時訪問對象,造成多次分配記憶體空間,所以要加上線程鎖//        if (_instance == nil) {//            _instance = [super allocWithZone:zone];//        }//        return _instance;//    }    // 也可以使用一次性代碼    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        if (_instance == nil) {            _instance = [super allocWithZone:zone];        }    });    return _instance;}// 為了使執行個體易於外界訪問 我們一般提供一個類方法// 類方法命名規範 share類名|default類名|類名+(instancetype)shareTools{    //return _instance;    // 最好用self 用Tools他的子類調用時會出現錯誤    return [[self alloc]init];}// 為了嚴謹,也要重寫copyWithZone 和 mutableCopyWithZone-(id)copyWithZone:(NSZone *)zone{    return _instance;}-(id)mutableCopyWithZone:(NSZone *)zone{    return _instance;}
三. 單例在MRC中的實現

MRC單例實現步驟

1 在類的內部提供一個static修飾的全域變數
2 提供一個類方法,方便外界訪問
3 重寫+allocWithZone方法,保證永遠都只為單例對象分配一次記憶體空間
4 嚴謹起見,重寫-copyWithZone方法和-MutableCopyWithZone方法
5 重寫release方法
6 重寫retain方法
7 建議在retainCount方法中返回一個最大值

配置MRC環境

1 注意ARC不是記憶體回收機制,是編譯器特性
2 配置MRC環境:build setting ->搜尋automatic ref->修改為N0

MRC中單例代碼實現
配置好MRC環境之後,在ARC代碼基礎上重寫下面的三個方法即可

 
-(oneway void)release{ }-(instancetype)retain{    return _instance;}-(NSUInteger)retainCount{    return MAXFLOAT;}
四. 一勞永逸,單例模式的最佳化

如果想要一勞永逸,我們將面臨兩個問題
1:如何寫一份單例代碼在ARC和MRC環境下都適用?
2:如何使一份單例代碼可以多個類共同使用
為瞭解決這兩個問題,我們可以在PCH檔案使用代參數的宏和條件編譯
利用條件編譯來判斷是ARC還是MRC環境

12345 #if __has_feature(objc_arc)//如果是ARC,那麼就執行這裡的代碼1#else//如果不是ARC,那麼就執行代理的代碼2#endif

注意:單例模式不可以使用繼承,因為使用繼承,同時也會繼承靜態變數,當子類和父類同時建立的時候只會建立一個先建立的執行個體對象。
廢話不多說了直接上代碼
PCH檔案Single.h

  
#define singleH(name) +(instancetype)share##name; #if __has_feature(objc_arc) #define singleM(name) static id _instance;+(instancetype)allocWithZone:(struct _NSZone *)zone{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        _instance = [super allocWithZone:zone];    });    return _instance;}+(instancetype)share##name{    return [[self alloc]init];}-(id)copyWithZone:(NSZone *)zone{    return _instance;}-(id)mutableCopyWithZone:(NSZone *)zone{    return _instance;}#else#define singleM static id _instance;+(instancetype)allocWithZone:(struct _NSZone *)zone{static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{_instance = [super allocWithZone:zone];});return _instance;}+(instancetype)shareTools{return [[self alloc]init];}-(id)copyWithZone:(NSZone *)zone{return _instance;}-(id)mutableCopyWithZone:(NSZone *)zone{return _instance;}-(oneway void)release{}-(instancetype)retain{    return _instance;}-(NSUInteger)retainCount{    return MAXFLOAT;}#endif

 


這時我們就可以一勞永逸,任何項目中,當我們要使用單例類的時候只要在項目中匯入PCH檔案然後
在.h檔案中調用singleH(類名)
在.m檔案中調用singleM(類名)

建立類時直接調用share類名方法即可。

iOS – 單例模式寫一次就夠了

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.