2012-02-26 44 views
-1

我一直在閱讀關於來自http://getsetgames.com/2009/08/30/the-objective-c-singleton/的一個客觀c單例示例。 的.M代碼看起來像混淆在一個目標-c單例示例

+(MySingleton*)sharedMySingleton{ 
@synchronized([MySingleton class]) 
{if (!_sharedMySingleton) 
    if(!_sharedMySingleton) 
    return _shareMySingleton; 
} 

.... 
-(id)init{ 
    self = [super init]; 
    if(self != nil){} 
    return self; 
} 
.... 

感謝您的例子,但我有一個困惑的地方,在你的代碼,我想知道在哪個地方的static MySingleton* _sharedMySingleton被初始化。例如,如果我們就必須有像

-(id)init{ 
    self = [super init]; 
    if(self != nil){ 
     _sharedMySingleton = self 
    } 
    return self; 
} 

回答

1

您miscopied從您發佈錯誤的鏈接代碼的一部分,一些執行。

@implementation MySingleton 
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; 
} 

-(id)init { 
    self = [super init]; 
    if (self != nil) { 
     // initialize stuff here 
    } 

    return self; 
} 

-(void)sayHello { 
    NSLog(@"Hello World!"); 
} 
@end 

看着你正在詢問的帖子中的代碼實際上是有道理的。 他在靜態方法+(MySingleton*)sharedMySingleton中所做的是他正在檢查_sharedMySingleton對象是否有值返回它,如果它沒有被初始化。 alloc方法是設置單例對象的方法,它不在初始化程序中設置。在技​​術上它是相同的,因爲它將指向將在一會兒之後被初始化的相同對象。 我希望澄清你的困惑。