Objective-C設計模式——單例Singleton(對象建立)

來源:互聯網
上載者:User

標籤:

單例

和其它語言的單例產不多,可以說是最簡單的一種設計模式了。但是有幾個點需要注意下,單例就是一個類只有一個執行個體。

所以我們要想辦法阻止該類產生別的執行個體,一般語言中都會將建構函式寫為private。但是OC中的函數並沒有限定符,所以我們需要用一些小技巧來屏蔽這一點。

 

應用情境

類只能有一個執行個體,而且必須從一個為人熟知的訪問點對其進行訪問,比如Factory 方法。

這個唯一的執行個體只能通過類的子類化進行擴充,而且擴充的對象不會破壞用戶端代碼。

 

注意

1.OC中單例的執行個體變數要定義在.m檔案

2.OC中單例需要重載allocWithZone:和copyWithZone:方法來防止建立別的執行個體。

3.單例建立要注意安全執行緒,不然就可能出現多個執行個體。

注意問題將會在Demo中講解

 

Demo

首先先來看一個最常規,的不嚴謹的單例實現:

@implementation Singletonstatic Singleton *sharedInstance;-(Singleton *)sharedInstance{    if(sharedInstance)    {        sharedInstance = [Singleton new];    }    return sharedInstance;}@end

這看似好像是可以得到單例對象了,但是這可以說是單例的一種變形。絕不能說這就是單例,因為我們可以輕鬆地通過其他方式來建立對象。

所以我們還要我修改allocWithZone:和copyWithZone:方法(alloc 和 copy 方法實際上就是調用這兩個方法)

-(id)copyWithZone:(NSZone *)zone{    return [[self class] sharedInstance];}+(id)allocWithZone:(struct _NSZone *)zone{    return [self sharedInstance];}

可是這就出現另一個問題,在sharedInstance方法裡面我們實際調用過allocWithZone:(new 調用 alloc),但是它的alloc被我們重寫了,這就會出現錯誤。所以我們需要修改sharedInstance方法

+(Singleton *)sharedInstance{    if(sharedInstance)    {        sharedInstance = [[super allocWithZone:NULL] init];    }    return sharedInstance;}

這樣就可以順利的返回單例了,而且無法通過其它方式產生執行個體對象。

看似完美了實際還會有問題出現,因為現在是非安全執行緒的,可能存在同一時間建立多個執行個體的情況,所以修改如下

+(instancetype)sharedInstance{    static dispatch_once_t once;    dispatch_once(&once, ^{        sharedInstance = [[super allocWithZone:NULL] init];    });    return sharedInstance;}

用戶端代碼如下:

        Singleton *singleton = [Singleton sharedInstance];        Singleton *singleton2 = [[Singleton alloc] init];        Singleton *singleton3 = [singleton copy];         [singleton print];        [singleton2 print];        [singleton3 print];

輸出結果:

2015-07-21 21:10:32.797 Singleton[42537:10347987] 0x7fff5fbff7a82015-07-21 21:10:32.798 Singleton[42537:10347987] 0x7fff5fbff7a82015-07-21 21:10:32.798 Singleton[42537:10347987] 0x7fff5fbff7a8

可以看到記憶體都指向了同一地址。

Objective-C設計模式——單例Singleton(對象建立)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.