![GCD 單例模式](http://ww4.sinaimg.cn/large/64e5447ajw1f46lhfr9hzj20e9064weo.jpg)
GCD 單例模式
單例模式是一種常用的軟件設計模式邑滨。
在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統(tǒng)中一個類只有一個實例而且該實例易于外界訪問钱反,從而方便對實例個數的控制并節(jié)約系統(tǒng)資源掖看。如果希望在系統(tǒng)中某個類的對象只能存在一個,單例模式是最好的解決方案面哥。
簡單的說哎壳,單例是一個特殊的實例,在單例所屬的類中只存在單例這么一個實例尚卫,并且單例類似全局變量归榕,在系統(tǒng)任意地方都能訪問單例.
單例對象的特點
- 可以被全局訪問
- 不會被釋放
- 創(chuàng)建過程只執(zhí)行1次
單例對象應用的場景
- 單例對象通常應用于當一個對象需要在多個界面間進行訪問的時候。
例如: 音視頻播放器的應用吱涉、數據庫的操作 SQLite...
創(chuàng)建視頻播放器 GCD 單例為例:
pragma mark -- GCD 單例模式完整實現(xiàn)
@implementation SDP_ViewForAVPlayerWithUrl
因為實例是全局的刹泄,因此要定義為全局變量,且需要存儲在靜態(tài)區(qū)怎爵,不釋放特石。不能存儲在棧區(qū)。靜態(tài)區(qū),防止外界訪問.
static SDP_ViewForAVPlayerWithUrl *ViewPlayer = nil;
// .h 中聲明出單例接口
// 這里的 alloc 會調用下面的 alloc 方法
+ (instancetype)shareVideoPlayer{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
ViewPlayer = [[self alloc]initWithFrame:CGRectMake(0, 0, HEIGHT, WIDTH)];
});
return ViewPlayer;
}
// 這個方法服務于 alloc ,不論外界調用多少次 alloc 叽讳,分配的空間地址都是一個
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
ViewPlayer = [super allocWithZone:zone];
});
return ViewPlayer;
}
//避免外界實現(xiàn) copy 方法憔四,所以當調用 copy 方法時,直接返回其本身哲思。因為我們希望 ViewPlayer 作為單例,所以 V1 調用 copy 時應該,直接返回本身兰粉。記得簽訂<NSCopying>協(xié)議。
SDP_ViewForAVPlayerWithUrl * V1 = [SDP_ViewForAVPlayerWithUrl shareVideoPlayer]
SDP_ViewForAVPlayerWithUrl * V2 = [V1 copy];
方法如下:
- (id)copyWithZone:(NSZone *)zone{
return ViewPlayer;
}
dispatch_once
dispatch_once 可以用來初始化一些全局的數據顶瞳,它能夠確保block代碼在app的生命周期內僅被運行一次玖姑,而且還是線程安全的,不需要額外加鎖慨菱。