iOS開發(fā)設(shè)計模式之單例設(shè)計模式-創(chuàng)新互聯(lián)

  • 單例設(shè)計模式

    成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比天涯網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式天涯網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋天涯地區(qū)。費用合理售后完善,10年實體公司更值得信賴。

是一種常用的軟件設(shè)計模式,保證系統(tǒng)中的一個類只有一個實例而且該實例易于被外界訪問。

單例的英文:singleton,在數(shù)學中的含義是:有且僅有一個元素的集合。

如果希望系統(tǒng)中某個類的對象只能存在一個,單例模式是最好的解決方案

優(yōu)點:

    可以阻止其他對象實例化對象的副本,從而確保所有對象都訪問唯一實例

缺點:

    單例對象一旦創(chuàng)建,對象指針保存在全局靜態(tài)區(qū),而單例對象在堆中分配內(nèi)存空間,在應(yīng)用程序終止后才會被釋放

使用到單例設(shè)計模式的類:(大部分用于管理系統(tǒng)的資源)

   UIApplication --- 代表當前的app

   UIFileManager --- 用于管理文件夾及文件屬性

   UIDevice --- 描述當前設(shè)備的信息,如尺寸、系統(tǒng)版本等

   …

  • 單例的簡單實現(xiàn)

如果想要讓一個類使用單例設(shè)計模式,通過以下幾步完成實現(xiàn),其中前三步是必須的

1)在類的源文件中,添加一個靜態(tài)對象指針,用于記錄單例對象的地址。靜態(tài)可以保證不能在其他源文件中直接訪問。

    如:播放器類AMPlayerTool

static AMPlayerTool * tool;

2)提供一個類方法,返回單例對象地址,且使用延遲創(chuàng)建的方式

  該類方法的命名規(guī)范:sharedXXX,如:

+ (instancetype) sharedPlayerTool
{
    if ( tool == nil ) {
        tool = [[AMPlayerTool allocWithZone:nil] init];
    }
    return tool;
}

3)保證不能通過alloc方法創(chuàng)建除單例外的對象

    alloc方法會調(diào)用allocWithZone:,應(yīng)重寫,如:

+ (instancetype) allocWithZone:(struct _NSZone *) zone
{
    if ( tool = nil ) {
        tool = [super allocWithZone:zone];
    }
    return tool;
}

    這樣就保證了,無論alloc或allocWithZone:被調(diào)用多少次都返回同一個對象的地址。

4)如果考慮對象的copy行為,還應(yīng)重寫copyWithZone:方法

  重寫應(yīng)保證不會創(chuàng)建新的對象,如:

- (id) copyWithZone:(struct _NSZone *) zone 
{
    return self
}

5)如果內(nèi)存管理使用的是非ARC,還要考慮重寫retain方法

    需要保證單例對象release一次就會銷毀,而retain沒有任何意義,如:

- (id) retain
{
    return self;
}

  • 多線程環(huán)境下的單例設(shè)計模式實現(xiàn)

dispatch_once是線程安全的,能夠做到在多線程的環(huán)境下Block中代碼只會被執(zhí)行一次。

修改簡單實現(xiàn)中的如下幾步

2)提供一個類方法,返回單例對象地址

+ (instancetype) sharedPlayerTool
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        tool = [[AMPlayerTool allocWithZone:nil] init];
    });
    return tool;
}

3)保證不能通過alloc方法創(chuàng)建除單例外的對象

+ (instancetype) allocWithZone:(struct _NSZone *) zone
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        tool = [[AMPlayerTool allocWithZone:nil] init];
    });
    return tool;
}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

標題名稱:iOS開發(fā)設(shè)計模式之單例設(shè)計模式-創(chuàng)新互聯(lián)
標題URL:http://muchs.cn/article46/cosoeg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名搜索引擎優(yōu)化、外貿(mào)建站、定制網(wǎng)站移動網(wǎng)站建設(shè)、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)