標籤:
百度定義:單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個執行個體.
維基百科:在軟體工程中,單例是一種用於實現單例的數學概念,即將類的執行個體化限制成僅一個對象的設計模式。
簡單理解:單例模式 是只有有一個實力對象的設計模式
這次 使用 單例 用 gcd 來建立
解釋幾個關鍵詞
dispatch_once :這個代碼塊 在整個應用的生命週期 只執行一次, 並且安全執行緒(如果被多個線程調用,該函數會同步等待直至代碼塊完成。gcd的底層做處理保證安全執行緒)
dispatch_once_t:(參數)這個斷言 是聲明這個代碼塊是否已經建立過了
優點:
(1)dispatch_once 安全執行緒
(2)代碼簡潔
(3)高效(比@synchronized 的兩倍 "52個技巧上說的")
我的使用情境很簡單, 我想建立一個單例字典 儲存 重新整理關鍵字 利用邏輯變化條件 指定重新整理頁面
我寫的枚舉恰好用到了 "52個技巧"裡面學到的知識,因為 枚舉 不一定得是 正整數 還可以是 四個字元的(通常4個字元代表一個位元組 int 是4個位元組)
這樣 我可以定義不同頁面的枚舉 並且每個頁面有自己獨立的枚舉參數
使用:
使用的時候 直接調用 類方法裡面的執行個體方法 [AHFRefreshPageUtil shareInstance]setNeedRefreshStatus:YES type:AHFSearchRefreshTypeAll];
這樣可以保證索引值對 唯一
展示建立單例:
//// AHFRefreshPageUtil.h// dailylife//// Created by HF on 16/5/3.////#import <Foundation/Foundation.h>@interface AHFRefreshPageUtil : NSObject+ (AHFRefreshPageUtil *)sharedInstance;@end
//// AHFRefreshPageUtil.m// dailylife//// Created by HF on 16/5/3.////#import "AHFRefreshPageUtil.h"@implementation AHFRefreshPageUtil{ NSMutableDictionary *refreshDictionary;}static AHFRefreshPageUtil *refreshPageUtil;- (instancetype)init{ self = [super init]; if(self){ refreshDictionary = [NSMutableDictionary dictionary]; } return self;}+ (AHFRefreshPageUtil *)sharedInstance{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ refreshPageUtil = [[AHFRefreshPageUtil alloc] init]; }); return refreshPageUtil;}//待添加目標執行個體方法
其實 這裡 這麼寫有潛在的bug 假如 使用
[[AHFRefreshPageUtil alloc]init] 就是 普通的初始化了,不是單例用法了 所以 應該 把alloc 和 copy 都重寫 防止意外出錯,但是 我這裡就預設 這一個用法,如果 出現 alloc 用法(並沒有類似需求的情況下) 那一定是豬隊友乾的,review代碼 好好說說他 就好了 哈哈 此處 不再多餘添加代碼(如果你想寫的完美 可以嘗試重寫 alloc copy 方法 讓他們返回時候 都是 同一個執行個體"sharedInstance" 就好了)
我的一個技術網友 總結的挺好的 簡單一句話" 主要看如何?線程唯一的建立 "
iOS 單例模式 學習 "52個方法 第6章 45條 使用 dispath_once 來執行只需運行一次的安全執行緒代碼"