[iOS] 單例類別製作

參考:Apple的Cocoa Fundamental Guide

以下內容參考該文件,如果有誤請見諒。

基本上單例就是目前程序中的類別裡面唯一一個允許的實例。通常它扮演一種指揮所的角色。

有兩種類型的單例類別,一種是如上所述,在目前程序中的類別,只有一個允許的實例。另一個是有類別工廠方法去傳回相同的實例,但你可以allocate和initailize額外的實例。

前者的類別範例可以參考UIApplication,後者可以參考NSFileManager。

以下介紹前者的單例類別建立法:

1.宣告你的單例物件的靜態實例,並用nil初始化之。
2.此類別的class factory method,當靜態實例是nil時,它會產生類別的實例。此class factory method的命名規則為:sharedInstance或是sharedManager。
3.要覆寫allocWithZone:方法,以確保另一個實例不被allocate並返回shared物件,這是怕如果有人嘗試要直接allocate和initialize你類別的實例而不使用class factory method。
4.它實作基本協議方法copyZone:、release、retain、retainCount和autorelease以確保單例狀態(最後四個是用於記憶管理code而不是垃圾收集code)。

讓我們看一個例子:

static MySingletonClass *sharedSingletonManager = nil;

+(MySingletonClass *)sharedManager
{
    if (sharedSingletonManager == nil) {
        sharedSingletonManager = [[super allocWithZone:NULL] init];
    }
    return sharedSingletonManager;
}

+(id) allocWithZone:(NSZone *) zone 
{
    return [[ self sharedManager] retain];
}

-(id) copyWithZone:(NSZone *) zone
{
    return self;
}

-(id) retain 
{
    return self;
}

-(NSInteger) retainCount 
{
    return NSUIntegerMax;  //denote an object that cannot be released
}

-(id) release
{
    //do nothing
}

-(id) autorelease
{
    return self;
}

如果你想要有一個單例(由class factory method所創造和控制),而且若需要的話也能透過allocate和initialize去創造其他的實例,就不要覆寫allocWithZone:和其他上述陳列出來的方法。

留言