乙個簡單而嚴謹的單例建立方法

2021-10-22 00:11:16 字數 1814 閱讀 5574

單例模式是一種古老而常用的設計模式,相信大家都已經能熟練編寫單例**,我在這裡不再贅述單例的實現。

大部分情況下,我們的單例都是主線程使用,所以這裡暫時不考慮執行緒同步問題。

不考慮同步問題的情況下,單例一般的書寫方式如下:

+

(instancetype)sharedinstance );

return instance;

}

但是這樣寫有個缺點。如果呼叫者不知道這是單例,會習慣性地自行 呼叫 alloc init方法嘗試新建乙個例項。為了阻止這種現象,我們還需要加入以下**才能完善這個單例:

+

(instancetype)allocwithzone:

(nszone *

)zone

-(instancetype)copywithzone:

(nszone *

)zone

原理:

allocwithzone是乙個古老的分配記憶體的介面,至於它的引數,早已被蘋果廢棄,我們可以不用去管它。我們只需要知道 allocwithzone最終會被alloc呼叫。為了阻止呼叫者建立多個例項,我們需要在這裡返回這個唯一的例項。

我們重寫了allocwithzone,就要注意在建立例項的時候 不能使用 init,因為init會最終呼叫到allocwithzone,第一次建立例項的時候不應該被阻止。正確的做法是呼叫[super allocwithzone:nil]。注意是super,如果呼叫[self allocwithzone:nil] 就會出現迴圈呼叫

copywithzone是乙個用於拷貝的函式,為了阻止呼叫者拷貝單例,我們需要在拷貝函式裡返回這唯一的示例。

有了以上**的複寫,終於成功阻止呼叫者新建、複製新例項。

以上原理請大家務必記住。

我們發現每次這樣編寫單例,**太冗餘,也很難記住那麼多**。

於是我定義了兩個巨集,簡化了單例的實現,也避免了碼農忘記覆蓋allocwithzone和copywithzone請框。我把我定義的巨集分享給大家,希望對大家有用。

標頭檔案中專用巨集

#define singleton_h         +(instancetype)sharedinstance;
原始檔中專用巨集

#define singleton_m         \

+ (instancetype)sharedinstance );\

return instance;\

}\+ (instancetype)allocwithzone:(nszone *)zone \

- (instancetype)copywithzone:(nszone *)zone

@inte***ce kkblocksequence : nsobject

singleton_h

//其他介面的定義-(

void

)test;

@end

@implementation kkblocksequence

//其他介面的定義-(

void

)test;

singleton_m

@end

以上用這兩個巨集在kkblocksequence類中實現了單例,已經包含了allocwithzone,copywithzone,並實現了單例唯一的訪問方法:sharedinstance

[kkblocksequence.sharedinstance test]

;

swift中建立乙個單例

在swift中建立單例,相比在objective c更加的便宜,首先建立乙個繼承自nsbject的myinstance類,實現的 如下 在swift中,類方法中是不允許定義靜態變數的,所以定義乙個靜態變數,應該寫在方法外面 static var once t dispatch once t 0 st...

乙個單例模式的簡單例子

ex1 public class singleton public static singleton getinstance return singleton 這個不多說了,肯定是錯誤的,如果多個執行緒訪問的時候都是 null,那麼接下來就是產生多個例項。不算單例模式。ex2 public clas...

單例模式(乙個類只能建立乙個例項)

三個步驟 通過new乙個靜態變數 private static single single new single1 構造方法私有化 private single 新建乙個公共獲取物件的方法 靜態 public static single getintance return 這個物件 一共有七中單例模...