91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS開發設計模式之單例設計模式

發布時間:2020-06-02 18:03:12 來源:網絡 閱讀:324 作者:ymanmeng123 欄目:移動開發
  • 單例設計模式

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

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


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

優點:

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

缺點:

    單例對象一旦創建,對象指針保存在全局靜態區,而單例對象在堆中分配內存空間,在應用程序終止后才會被釋放


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

   UIApplication  --- 代表當前的app

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

   UIDevice --- 描述當前設備的信息,如尺寸、系統版本等

   …


  • 單例的簡單實現

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

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

    如:播放器類AMPlayerTool

static AMPlayerTool * tool;

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

    該類方法的命名規范:sharedXXX,如:

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

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

    alloc方法會調用allocWithZone:,應重寫,如:

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

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

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

    重寫應保證不會創建新的對象,如:

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

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

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

- (id) retain
{
    return self;
}


  • 多線程環境下的單例設計模式實現

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

修改簡單實現中的如下幾步

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

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

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

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






向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

土默特右旗| 合山市| 浏阳市| 新蔡县| 恭城| 蒲江县| 蒙山县| 宿松县| 视频| 安顺市| 宜丰县| 青浦区| 平昌县| 宁波市| 宽城| 应城市| 通化市| 铜梁县| 满洲里市| 浦县| 延长县| 奈曼旗| 夏津县| 中宁县| 顺平县| 泽州县| 望奎县| 合肥市| 浏阳市| 都昌县| 五河县| 深州市| 湾仔区| 英德市| 石台县| 千阳县| 东明县| 灵寿县| 蓬安县| 友谊县| 乐业县|