0

私は github からライブラリをダウンロードしましたが、ライブラリのメイン シングルトンで、次のコードにリークの可能性があることに気付きました。

+(DDGameKitHelper*) sharedGameKitHelper
{
    @synchronized(self)
    {
        if (instanceOfGameKitHelper == nil)
        {
            [[DDGameKitHelper alloc] init];
        }

        return instanceOfGameKitHelper;
    }

    return nil;
}

明らかに、リリースや自動リリースはどこにもないので、それを行う必要がありますが、どのように、どのように適切に行うのですか? 私はインターネットでさまざまな Singleton 設計パターンを調べましたが、この場合は、instanceOfGameKitHelper を alloc および init 行に割り当てるだけです。

とにかく、どうすればこれを適切に修正できますか?

ありがとう!

4

2 に答える 2

2

定義上、シングルトンは一度作成されたら解放されません。グローバル変数のようなものと考えてください。

詳細については、Apple のドキュメント: Cocoa Core Competencies - Singletonを参照してください。

または、その例 (ページの下部): http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974 -CH4-SW32

私は通常@rmaddyの方法を使用します。もちろん、そのようにしても、まだシングルトンであるため、変数を割り当てて解放することはありません。

于 2012-11-20T04:44:13.073 に答える
2

シングルトンをセットアップするより現代的な方法は次のようになります。

+ (DDGameKitHelper *)sharedGameKitHelper {
    static DDGameKitHelper *instance = nil;
    static dispatch_once_t predicate;

    dispatch_once(&predicate, ^{ instance = [self new]; });

    return instance;
}
于 2012-11-20T04:51:51.773 に答える