2012-02-26 9 views
-1

私はhttp://getsetgames.com/2009/08/30/the-objective-c-singleton/からobjective-cシングルトンの例について読んでいます。 が.Mコードが1つの目的で混乱-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が初期化された場所に疑問に思って。例えば、我々はあなたが誤って掲載リンクからコードの一部をmiscopied

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

答えて

1

のようないくつかの実装を持っていなければならない場合。

@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メソッドはシングルトンオブジェクトを設定するメソッドであり、初期化子では設定されていません。技術的には同じです。その瞬間から初期化される同じオブジェクトを指しているからです。 あなたの混乱を明確にすることを願っています。