0

パブリックライブラリから使用するコードの分析を行ったところ、XCodeは[[[self alloc]で始まる行の問題を指摘しました:

static MyClass *_sharedInstance = nil;

+ (MyClass*)sharedInstance
{
    if (_sharedInstance != nil) {
        return _sharedInstance;
    }

    @synchronized(self) {
        if (_sharedInstance == nil) {
            [[[self alloc] init] autorelease];
        }
    }

    return _sharedInstance;
}

この行を見ると、_sharedInstanceがどのように割り当てられるのかわかりません。このコードが機能する理由を誰かが私に説明できますか?私はあなたが書く必要があると思っていたでしょう:

_sharedInstance = [[[self alloc] init] autorelease];
4

2 に答える 2

3

+sharedInstanceこれは、メソッドを考えすぎて、せいぜい混乱し、他のシェナニガン (オーバーライドなど) のためにのみ機能する方法のさらに別の例ですrelease

これを行うだけで完了です:

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

MyClassシンプルでわかりやすく、非シングルトンとして使用することを妨げません。これの 1 つの欠点は、+sharedInstance再帰的に呼び出された場合にデッドロックが発生すること+sharedInstanceですが、一般的に再帰的には悪い兆候です。

于 2013-03-20T16:54:08.510 に答える
0

allocinit ではなく で設定されている可能性があります。これにより、 内からの再帰呼び出しで別のインスタンスが作成されるのを防ぐことができますinit

説明:

複雑なシングルトンが多くのセットアップを行うのは一般的です。このセットアップは複雑で、このクラス以外にも影響を与える可能性があります。このセットアップ内の (深い) からシングルトンが要求されることがあります。を呼び出す前に変数_sharedInstanceを設定しないと、2 つのインスタンスが作成されます。init

于 2013-03-20T16:23:18.883 に答える