差異

2013-02-14 16 views
3

所以我有一個單身和我試着去了解這兩種實現之間的區別:功能我試圖運行我的代碼與他們兩個,他們都工作差異

但是,我注意到在第一個實現中沒有[self alloc]被調用,而是調用[super alloc]。我有點困惑。它似乎工作,但似乎有點不可思議所以我想知道是否有人能澄清

1路:

+(id)getSingleton 
{ 

    static dispatch_once_t pred; 
    dispatch_once(&pred, ^{ 
    locMgrSingleton = [[super alloc] init]; 

     }); 

    return locMgrSingleton; 

} 

另一種方式

+(id)getSingleton 
{ 
    @synchronized(self) 
    { 
     if (locMgrSingleton == nil) 
     { 
      locMgrSingleton = [[self alloc]init]; 
      NSLog(@"Created a new locMgrSingleton"); 
     } 
     else 
     { 
      NSLog(@"locMgrSingleton exists"); 
     } 

    } 

    return locMgrSingleton; 
} 
+0

第一個應該使用'self alloc'。 – rmaddy 2013-02-14 21:46:07

+0

您是在詢問關於同步機制的差異,還是'[self alloc]'和'[super alloc]'之間的區別?對於第二種情況,這可能會有所幫助:[用allocWithZone創建一個單例:](http://stackoverflow.com/q/11962913)(不管怎麼說,你已經重寫了'alloc')。 – 2013-02-14 21:46:49

回答

4

使用[self alloc] VS [super alloc]使得除非類沒有區別也會覆蓋+alloc。也就是說,應該叫[self alloc]。我敢打賭,這叫super,因爲這可能是從覆蓋+alloc來返回單身人士的實現改編而來的。

在任何情況下,兩種模式之間的差異,除了self VS super,在我的答案解釋this other question,但總之,dispatch_once()是做到這一點的現代生活方式。它比@synchronized更快,並且具有更多的語義含義。

1

正如在例如http://cocoasamurai.blogspot.fi/2011/04/singletons-your-doing-them-wrong.html,dispatch_once調用看起來似乎比@synchronized(self)稍快。

至於爲什麼[super alloc]而不是[self alloc],我沒有看到任何理由爲什麼它特別適用於dispatch_once版本,但沒有其他原因。在靜態方法中,self只是簡單地指向類本身(並且指向其直接超類的super),並且我將它看作是寫實際類名的簡寫,僅此而已。

雖然我只使用過[self alloc],因爲我反正寫了當前類的名字,而不是它的超類。不知道是否具體調用[super alloc]具有任何特殊意義。

1

在類方法中,self指向類本身。在你的兩個實現中,[self alloc],[MySingleton alloc][super alloc]在語義上都是相同的 - 除非你出於某種奇怪的原因覆蓋+alloc。你可能想使用[super alloc]比別人

一個原因是,當你明確地標記在你的聲明與編譯器指令+alloc不可用:

+(instancetype) alloc __attribute__((unavailable("alloc not available")));

+(instancetype) alloc NS_UNAVAILABLE;

否則,當你嘗試+alloc你的單例類的一個實例時,編譯器會產生錯誤 - 這通常是你wa nt除在+alloc dispatch_once中共享單例實例外。