2013-03-20 49 views
0

我只是做了一個分析,我從一個公共圖書館使用代碼,並XCode中指出了開頭的線路有問題[[[自我頁頭]:這個靜態單體成員如何在Obj-C中設置?

static MyClass *_sharedInstance = nil; 

+ (MyClass*)sharedInstance 
{ 
    if (_sharedInstance != nil) { 
     return _sharedInstance; 
    } 

    @synchronized(self) { 
     if (_sharedInstance == nil) { 
      [[[self alloc] init] autorelease]; 
     } 
    } 

    return _sharedInstance; 
} 

我看着這條線,我不知道_sharedInstance如何被分配。任何人都可以向我解釋爲什麼這個代碼工作?我原本以爲你需要寫:

_sharedInstance = [[[self alloc] init] autorelease]; 
+4

'MyClass'是否覆蓋'alloc'?此外,它不應該'autorelease',以便看起來破碎。 – trojanfoe 2013-03-20 16:18:06

+0

根本不是。這是一個錯誤 – 2013-03-20 16:20:34

回答

0

它可能被設置在alloc,而不是初始化。這將防止在init內的遞歸調用中創建另一個實例。

說明:

是很常見的複雜單身做了很多設置。這種設置可能很複雜,不僅僅涉及這一類。發生這種情況時,單身人士在此設置中被要求(深)。如果_sharedInstance變量在之前不會被設置爲,則調用init,將創建兩個實例。

+0

你是對的!這個傢伙把它設置在allocWithZone。我以前從來沒有見過這種設計模式......很奇怪。 – esilver 2013-03-21 17:25:04

+0

@esilver:因爲這是一個反模式(對它很好!)。對於你自己的單身人士,請按照下方的建議。 – 2013-03-25 20:17:02

4

這是另一種方法,將+sharedInstance方法過度混淆,最多隻會因爲其他惡劣設計而起作用(如重寫release)。

只是這樣做,並用它做:

+ (id)sharedInstance 
{ 
    static MyClass *sharedInstance; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[self alloc] init]; 
    }); 
    return sharedInstance; 
} 

簡單,直接,用MyClass作爲非單身並不排除。如果+sharedInstance被遞歸地調用,則會出現死鎖,但是+sharedInstance遞歸通常是一個不好的信號。