其實原理是都很類似,就是設法讓app只產生一個object instance,而且是透過特定的static method來獲得這個instance,而不是透過constructor來建立各個獨立的instance。對於一些某些需要集中管理的資訊或是資源,singleton pattern十分有用。
在Objective-C中,因為無法宣告constructor為private,所以很難避免使用者去呼叫。另外,因為Objective-C的alloc/retain/release/dealloc的機制,所以我們也必須去處理有關instance reference count的問題,不然很容易會出現記憶體管理的問題...而造成災難。
如何撰寫呢?首先,先在header file中定義要取得singleton instance的static method,例如:
+ (id) sharedInstance;然後,在對應的.m檔案中,添加下列內容:
static MyManager *instance = nil;@implementation MyManager#pragma mark Singleton Methods+ (id)sharedInstance {@synchronized(self) {if(sharedMyManager == nil)sharedMyManager = [[super allocWithZone:NULL] init];}return sharedMyManager;}+ (id)allocWithZone:(NSZone *)zone {return [[self sharedManager] retain];}- (id)copyWithZone:(NSZone *)zone {return self;}- (id)retain {return self;}- (unsigned)retainCount {return UINT_MAX; //denotes an object that cannot be released}- (void)release {// never release}- (id)autorelease {return self;}- (id)init {if (self = [super init]) {// initialize your instance variables}return self;}- (void)dealloc {// Should never be called, but just here for clarity really.// release your instance variables[super dealloc];}@end
首先,是定義全域變數instance,用來表示此class的singleton instance。然後實作之前定義的singleton method,讓它傳回該instance variable,如此一來,只要呼叫此method,就可以取得同一個instance。其他的method都是override原本NSObject的定義。主要是用來處理reference count的問題,用來避免該instance被不小心release掉。其中,在init跟dealloc,可以對自己定義的instance variables做初始化跟回收。原則上,Objective-C的singleton pattern大概就是長這樣。
心得:比起Java,真的複雜多了...而且老實說,我也不知道這樣想是不是真的沒問題...只是目前google到的寫法,大多是長得類似這樣。
沒有留言:
張貼留言