iOS 單例模式 學習 "52個方法 第6章 45條 使用 dispath_once 來執行只需運行一次的線程安全代碼"
百度定義:單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例.
維基百科:在軟件工程中,單例是一種用于實現單例的數學概念,即將類的實例化限制成僅一個對象的設計模式。
簡單理解:單例模式 是只有有一個實例對象的設計模式
這次 使用 單例 用 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" 就好了)
我的一個技術網友 總結的挺好的 簡單一句話" 主要看如何實現線程唯一的創建 "
posted on 2016-05-03 17:16 ACM_Someone like you 閱讀(790) 評論(0) 收藏 舉報
浙公網安備 33010602011771號