1

私のプロジェクトのサードパーティ ライブラリの 1 つで、シングルトンの sharedInstance メソッドが最後の return_sharedInstance 行でアナライザーの警告をスローしているようです。

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

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

    return _sharedInstance;
}

とにかく、この警告を実際に修正する適切な方法は何ですか? また、このようなメソッドで自己割り当てを行うべきではないことを見てきましたが、それは本当ですか?

ありがとう!

4

2 に答える 2

5

実際にあなたの行[[[self alloc] init] autorelease];はオブジェクト上に作成され、すぐに捨てられます。と交換する必要があります_sharedInstance = [[self alloc] init];

于 2013-02-03T19:47:19.170 に答える
2

それはautorelease; それを削除する必要がありますが、さらに重要なことに(@Yaman/@rmaddyに感謝)、割り当てられたオブジェクトをに割り当てていません_sharedInstance

次に実行ループが終了したとき、または次回自動解放プールが破棄されたときのいずれか早い方で、インスタンスが解放されます。_sharedInstanceポインターはぶら下がったままになり、オブジェクトの次のユーザーは、割り当て解除されたインスタンス(またはそのようなもの) に送信されたメッセージで失敗します。

于 2013-02-03T19:45:43.940 に答える