繼之前轉載的iOS單例模式,經查看文檔及書籍,瞭解有關單例子類化的問題。
對於前面的iOS單例模式,一般使用基本已能滿足。但有時要將單例子類化時,我們將會遇到問題。
下面上代碼:
//之前的簡要代碼
+ (id)sharedManager {
static MyManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
//改進後代碼
+ (id)sharedManager {
static MyManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//這樣初始化的singletone 當子類化時,永遠返回的是Singletone。 因爲Singleton重載了所有實例話相關的方法,所以對其子類化相當需要技巧。
//下面是改進方法
// sharedMyManager = [[super allocWithZone:NULL] init];
//使用此方法[NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone * zone),根據類的類型實例化任何對象。
sharedMyManager = [NSAllocateObject([self class], 0, NULL) init];
});
return sharedMyManager;
}