日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

两种创建单例的方法

發布時間:2025/4/16 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 两种创建单例的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

?? 1.

單例模式是在實際項目開發中用到比較多的一種設計模式,設計原理是整個系統只產生一個對象實例,通過一個統一的方法對外提供這個實例給外部使用。

在Java中,構造單例一般將類的構造函數聲明為private類型,然后通過一個靜態方法對外提供實例對象,那么,在OC中,如何實現單例的,請看下面完整代碼。


@implementation Car

//聲明一個靜態對象引用并賦為nil

static Car *sharedInstance= nil;


//聲明類方法(+為類方法,也就是Java中的靜態方法)

+(Car *) sharedInstance

{

? ? ?if(!sharedInstance)

? ? ?{

? ? ? ? ??sharedInstance = [[self alloc] init];

? ? ?}

? ? ?return?sharedInstance;

}

@end


//覆蓋allocWithZone:方法可以防止任何類創建第二個實例。使用synchronized()可以防止多個線程同時執行該段代碼(線程鎖)


+(id)allocWithZone:(NSZone *) zone

{

? ? ?@synchronized(self)

? ? ?{

? ? ? ? ? if(sharedInstance == nil)

? ? ? ? ? {

? ? ? ? ? ? ? ?sharedInstance = [super allocWithZone:zone];

? ? ? ? ? ? ? ?return?sharedInstance;

? ? ? ? ? }

? ? ?}

? ? ?return?sharedInstance;

}


好了,到這里,OC中的單例就創建完成了,使用的話,直接類名調用類方法即可

?? 2.在開發中我們會用到NSNotificationCenter、NSFileManager等,獲取他們的實例通過[NSNotificationCenter?defaultCenter]和[NSFileManager?defaultManager]來獲取,其實這就是單例。

我們先看下函數void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);其中第一個參數predicate,該參數是檢查后面第二個參數所代表的代碼塊是否被調用的謂詞,第二個參數則是在整個應用程序中只會被調用一次的代碼塊。dispach_once函數中的代碼塊只會被執行一次,而且還是線程安全的。

? ? ? ?接下來我們來實現自己的單例,這里有一個SchoolManager類,為這個類實現單例

[cpp] view plain copy
  • +(SchoolManager?*)sharedInstance??
  • {??
  • ????static?SchoolManager?*sharedManager;??
  • ??????
  • ????static?dispatch_once_t?onceToken;??
  • ????dispatch_once(&onceToken,?^{??
  • ????????sharedManager?=?[[SchoolManager?alloc]?init];??
  • ????});??
  • ??????
  • ????return?sharedManager;??
  • }??
  • 到目前為止,我們就實現了一個單例,一切就搞定了,是不是很簡單!

    使用就按照如下方式獲取唯一實例即可:

    [cpp] view plain copy
  • SchoolManager?*schoolManager?=?[SchoolManager?sharedInstance];??
  • 轉載于:https://my.oschina.net/LangZiAiFer/blog/126982

    總結

    以上是生活随笔為你收集整理的两种创建单例的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。