0

このコードを考えてみましょう:

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

このシングルトンデザインパターンに従うと、次のように仮定できます。

  • GCDのおかげで、割り当てと初期化は1回だけ実行されます。
  • sharedInstanceクラス変数は、この実装内からのみアクセスでき、インスタンスに関係なくクラス間で共有できます。

初めてインスタンスを作成するときは、次のようにします。

MyClass *something = [MyClass sharedInstance];

私の質問は、プレビューコードをもう一度呼び出すと、次のようになります。

MyClass *somethingOther = [MyClass sharedInstance];

私はただ一つの結果を考えることができます。

結果:

static MyClass *sharedInstance = nil;

sharedInstanceクラス変数がnilを指すようにし、nilが返されるため、somethingOtherはnilになります。

しかし、シングルトンで発生するはずだったのは、代わりに共有インスタンスが返されることだと思いました。

ここで、このコードについて考えてみましょう。

+ (MotionManagerSingleton*)sharedInstance {

    static MotionManagerSingleton *_sharedInstance;
    if(!_sharedInstance) {
        static dispatch_once_t oncePredicate;
        dispatch_once(&oncePredicate, ^{
            _sharedInstance = [[super allocWithZone:nil] init];
            });
    }

    return _sharedInstance;
}

+ (id)allocWithZone:(NSZone *)zone {    

    return [self sharedInstance];
}

- (id)copyWithZone:(NSZone *)zone {
    return self;    
}

ここに

static MotionManagerSingleton *_sharedInstance;

変数をnilに設定していませんが、すべてのオブジェクトポインタがデフォルトでnilに初期化されていると思いました。

私の質問は、これらのクラスメソッドが「sharedInstance」をどのように返すのかということです。

ありがとう

4

1 に答える 1

3

1。初期化されていないポインタは初期化されていません。

static MotionManagerSingleton *_sharedInstance;

MotionManagerSingletonがを指すようにはなりませんnil。未定義の(ゴミ)場所を指します。

二。宣言された変数はstatic一度だけ初期化されるため(はい、構文はセマンティクスと少し矛盾しています)、最初の実装では、返された共有インスタンスがnullになりません。これは完全に優れた実装です。

于 2012-06-02T06:11:18.210 に答える