2011-10-11 107 views
0

假設我得到如下編碼的單例類MySingleton。目標C:單例模式使用

現在是一個singleton類,就像任何其他類一樣。我可以有非原子的實例變量並保留?

我可以有:@property(非原子,保留)的NSString * instanceVar在.h文件

,並在.m文件@synthesize instanceVar?

static MySingleton* _sharedMySingleton = nil; 

+(MySingleton*)sharedMySingleton 
{ 
    @synchronized([MySingleton class]) 
    { 
     if (!_sharedMySingleton) 
      [[self alloc] init]; 

     return _sharedMySingleton; 
    } 

    return nil; 
} 

+(id)alloc 
{ 
    @synchronized([MySingleton class]) 
    { 
     NSAssert(_sharedMySingleton == nil, @"Attempted to allocate a second instance of a singleton."); 
     _sharedMySingleton = [super alloc]; 
     return _sharedMySingleton; 
    } 

    return nil; 
} 
+0

要注意,ARC將打破現有的辛格爾頓實現。他們建議從現在開始使用ARC來實現類似的功能。 –

+0

您應該使用'dispatch_once'而不是'@ synchronized',[它的速度快20倍](http://bjhomer.blogspot.com/2011/09/synchronized-vs-dispatchonce.html)。 – Jano

+0

如果你打算多線程,那麼你希望你的單例屬性是原子的,以避免競爭條件(以及用@synchronized指令包裝你的代碼的關鍵部分)。 – jbat100

回答

1

是的,單例類的實例與標準類的行爲相同,只有一個實例。

你擁有的模式過於複雜,沒有必要爲+(id)alloc 下面是一個simplier模式:

@implementation MySingleton 
static MySingleton* _sharedMySingleton = nil; 

+(MySingleton*)sharedMySingleton 
{ 
    @synchronized([MySingleton class]) 
    { 
     if (!_sharedMySingleton) 
      _sharedSingleton = [[MySingleton alloc] init]; 
    } 

    return _sharedMySingleton; 
} 
0

不熟悉您提到的註釋,因爲我是C++開發人員,但單身人士當然可以擁有實例數據。這是它的價值之一。

1

您打賭。對於你的應用程序的其餘部分,你的單例看起來和其他類一樣工作。唯一的區別是,當你的應用程序試圖創建一個新的單例時,它總是接收相同的對象。但是單例可以像其他任何類一樣擁有實例方法和實例變量。

0

是的,你可以有實例變量,單例只是一個普通的類,在任何給定的時間只有一個實例。