2016-09-05 100 views
2

我學習創建Objective-C中一個單獨的類和整個這個職位它使用GCD確保Singleton模式的強制執行來了。我對這個類中的實例init方法以及它爲什麼在那裏感到困惑。Objective-C的單例類的實例初始化函數

看起來像有人試圖初始化MyManager實例時會調用它,但爲什麼作者嘗試初始化父類的實例([super init])?與ObjC混亂

#import "MyManager.h" 

@implementation MyManager 

@synthesize someProperty; 

#pragma mark Singleton Methods 

+ (id)sharedManager { 
    static MyManager *sharedMyManager = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedMyManager = [[self alloc] init]; 
    }); 
    return sharedMyManager; 
} 

- (id)init { 
    //what is purpose of initialising parent class (NSObject's) instance 
    if (self = [super init]) { 
     someProperty = [[NSString alloc] initWithString:@"Default Property Value"]; 
    } 
    return self; 
} 

- (void)dealloc { 
    // Should never be called, but just here for clarity really. 
} 

@end 
+1

http://stackoverflow.com/questions/2956943/why -should-I-調用自超init和http://stackoverflow.com/questions/18693023/objective-c-questions-about-self-super-init你的問題是不相關真的單身,因爲我們幾乎總是在自定義初始化方法中調用[super init]。 – Larme

回答

1

一個細微的一點是,語言沒有靜態方法。它有類方法

即,通過+前綴方法附着到類對象,並繼承和可以被重寫一樣實例方法。

因此,寫一個單身的情況下,單一實例的初始化工作,就像在超類有機會初始化所有其他實例的初始化了。

由於大多數單身從NSObject繼承,它是一個無操作。

但是,有時候,你結束了:

NSObject 
    AbstractSingletonThatIsNeverDirectlyInstantiated 
     ConcreteSingletonForLocalOnlyMode 
     ConcreteSingletonForOnlineMode 

(完全是編造的例子,但我已經看到了類似)

+0

雖然所有對象都是從NSObject繼承而來的,但是你不應該再繼承獨立類的子類。你不能保證單例是引用單基類還是一個子類。 (另外,我覺得OP的問題就簡單得多了,就問爲什麼'init'調用'[超級初始化]'。) – Rob

+0

@Rob在這種情況下,AbstractSingleton永遠不會被實例化,但兩個具體的子類會。而且,是的,有一些模式可以讓每個人都漂浮在一起,完全有效。爲清晰起見進行編輯。它類似於類集羣,但是是單例集羣。 – bbum

+0

當然,但即使基礎單例是抽象的,你仍然有兩個單例子類的問題,因爲它們共享'sharedManager'和'onceToken'。因此,只要一個具體的單例被實例化,你就不能正確地實例化另一個具體的子類的單例。基本上,每個單例類都需要自己的'sharedManager'和它自己的'onceToken'(或者抽象基類需要比'dispatch_once'更復雜的東西來實現一些線程安全的單例工廠(!)模式)。 – Rob