2017-09-20 7 views
0

私はシングルトンのベスト実装を理解しようとしています これは私が得た最新のものです。Objective-Cシングルトンの実装

これは、.mファイルの実装であることに何か問題:私は行うことができます

#import "Foo.h" 

static Foo *object = nil; 

@implementation Foo 

+ (Foo*)sharedObject { 
    return [[Foo alloc] init]; 
} 

- (id)init { 
    static dispatch_once_t once; 
    dispatch_once(&once, ^{ 
     object = [super init]; 
    }); 

    return object; 
} 

@end 

とそれを使用する:

[Foo sharedObject] 

または

[[Foo alloc] init] 

、両方の意志同じオブジェクトを返します。

+0

あなたがしていることは悪い習慣であり、シングルトンを行うのは間違った方法です。 'alloc init'は、レイジーに割り当てられたシングルトンではなく、常にインスタンスを返す必要があります。右のコーディングパターンの@isamankumara答えを参照してください。 – Shebuka

+0

なぜそれが必須であると言っているのですか、あなたの(私の)友人は、シングルトンの忠誠ですと思います。これが私がこの質問を書いた正確な理由です。シングルトンはこのクラスの唯一のインスタンスです。そうでなければそれはシングルトンではありません –

答えて

0

あなたのFooクラスによると、 2つの方法の両方を呼び出すときに違いはありません。 しかし、私は

+ (id) sharedObject { 
    static Foo *sharedobj = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedobj = [[self alloc] init]; 
    }); 
    return sharedobj; 
} 

- (id)init { 
    if (self = [super init]) { 
     someProperty = [[NSString alloc] initWithString:@"Default Property Value"]; 
    } 
    return self; 
} 

新しいインスタンスを作成するとしますが、以下のように、あなたのFooシングルトン方法を変更することができれば、より良いと思います。しかし、initメソッドをオーバーライドしているため、allocメソッドを使用して作成することはありません。

+0

あなたのソリューションについての私の懸念は、initメソッドを呼び出すとまだインスタンスを作成できますが、または+ sharedObjectは同じオブジェクトを返します。そして、シングルトンのデザインパターンについての私の理解によれば、あなたはこのクラスの別のインスタンスをとにかく作成すべきではありません。 –

関連する問題