參考: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)。
讓我們看一個例子:
如果你想要有一個單例(由class factory method所創造和控制),而且若需要的話也能透過allocate和initialize去創造其他的實例,就不要覆寫allocWithZone:和其他上述陳列出來的方法。
以下內容參考該文件,如果有誤請見諒。
基本上單例就是目前程序中的類別裡面唯一一個允許的實例。通常它扮演一種指揮所的角色。
有兩種類型的單例類別,一種是如上所述,在目前程序中的類別,只有一個允許的實例。另一個是有類別工廠方法去傳回相同的實例,但你可以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:和其他上述陳列出來的方法。
留言
張貼留言