iOS開發中的單例模式

Cloudox 2022-01-07 21:49:35 阅读数:113

ios 模式

簡介

開發者應該經常看到單例模式這個設計模式,那什麼是單例模式呢?

我們知道面向對象編程會生成很多實例,比如對於學生這個對象可能有小明、小紅、小强等多個具體的學生對象,多個對象可以方便我們對不同的對象根據不同的需求進行操作。

那有沒有只需要一個對象的時候呢?有的。

比如用戶信息,大部分App都只允許同時只有一個用戶登錄,那麼也就是說用戶信息只會有一份,那如果我們要用對象的模式來管理用戶信息,就應該保證整個App只有一個用戶信息對象,否則如果存在多個的話,可能會出現改了這個對象的值,卻讀取了那個對象的值,造成數據不一致。

需要保證只有一個對象的情况還有很多,根據項目需求的不同一定有其用武之處。那麼對於這種要求保證只有一個對象實例的設計模式,就稱為單例模式,簡明易懂是吧。

iOS開發中的實現

介紹完了單例模式是什麼,現在看看怎麼實現。

各個語言都有自己的單例模式,其實對於單例模式的實現,最根本的一點就在於保證全局只有一個對象實例。也就是說每次要使用的時候,如果還沒創建過實例,那就創建,如果已經創建過了,那就直接獲取之前創建過的。

根據上面的描述,很容易想到的一種方式是在創建的時候判斷一下實例是否是 nil,如果是,錶示還沒創建實例,那就創建,如果不是 nil 了,說明之前已經創建過了,那就直接獲取就好了。

這是一種方法,但其實判斷是否為 nil 需要一定時間,雖然也不多,但是萬一在這個時間之內創建了兩個實例呢,尤其是在多線程的情况下。另一種更快的方式是使用一個BOOL型變量來作為判斷的信號量,創建後就改變其值,每次調用時判斷一下值就可以了,這會比判斷 nil 要快一點,但依然不能完全保證。

那有沒有可以保證絕對唯一的方法呢?有的,用 GCD 中的 dispatch_once 方法,就可以保證創建新實例的代碼只執行一次,那麼其創建的實例也就是全局唯一的實例了。

我們可以看看代碼:

#import "Singleton.h"
@implementation Singleton
static Singleton *_instance = nil;
+ (instancetype)shareInstance {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[super allocWithZone:NULL] init];
});
return _instance;
}
+ (id)allocWithZone:(struct _NSZone *)zone {
return [Singleton shareInstance];
}
+ (id)copyWithZone:(struct _NSZone *)zone {
return [Singleton shareInstance];
}

上面的代碼就是利用 dispatch_once 方法來保證其生成新實例的代碼只執行一次,可以保證多線程的唯一性。

在 alloc 時,Objective-C 會調用 allocWithZone ,通過覆寫它來返回單例。複制對象的時候也是通過覆寫調用的 copyWithZone 方法來達到返回唯一單例的目的。

用上面的方法,就可以創建單例了。具體的用法,純粹看各自的發揮,可以將一些常用的操作提取出來放在頭文件中供調用,這樣其實就能方便的獲取和操作單例的內容了。

版权声明:本文为[Cloudox]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201072149348845.html