0

シングルトンをどのようにリリースするのだろうかと思っていました

+ (DSActivityView *)activityViewForView:(UIView *)addToView withLabel:(NSString *)labelText width:(NSUInteger)labelWidth;
 {
    // Not autoreleased, as it is basically a singleton:
    return [[self alloc] initForView:addToView withLabel:labelText width:labelWidth];
 }

分析ツールを使用してこれを分析すると、次のエラーが発生します。90行目でオブジェクトがリークする可能性があります。これは戻る行です。

エラーメッセージの問題を解決する自動リリースを試しましたが、シングルトンの自動リリースは適切ではないことを読んだため、正しい解決策を確信できませんでした。誰かがこのオブジェクトを解放するための最良の方法を特定するのを手伝ってくれるでしょうか?

ありがとう

4

3 に答える 3

2

アナライザーが警告を出す理由は、基本的に、メソッド名です。

+ (DSActivityView *)activityViewForView:(UIView *)addToView withLabel:(NSString *)labelText width:(NSUInteger)labelWidth;

Objective-Cの規則に従って、「create」/「new」/...で始まるすべてのメソッド名は保持されたオブジェクトを返します。このメソッドは、自動解放されたオブジェクトを返すことが期待されるコンビニエンスコンストラクターのカテゴリに分類されるため、警告が表示されます。

一方、これはシングルトンだと言いますが、実際はそうではありません。したがって、このメソッドを複数回呼び出すことになり、実際にリークが発生する可能性があります。メソッドをより安全に(そしてよりシングルトンのように)するための基本的な方法は次のとおりです。

+ (DSActivityView *)activityViewForView:(UIView *)addToView withLabel:(NSString *)labelText width:(NSUInteger)labelWidth;
{
    static DSActivityView* gDSActivityViewSingleton = nil;
    if (!gDSActivityViewSingleton)
          gDSActivityViewSingleton = [[self alloc] initForView:addToView withLabel:labelText width:labelWidth];
    return gDSActivityViewSingleton;
}

これにより、アナライザーがリラックスし、メソッドの誤用の可能性の前でより安全になります。

于 2012-09-03T16:04:53.520 に答える
1

自動解放を使用します。そうしない理由はありません。基本的に、オブジェクトの所有権はオブジェクトに属するため、手動で解放することはできません。シングルトンであるため、所有していないかどうかは関係ありません。おそらく、次に呼び出してスコープ内で必要になったときに、別の便利なメソッドを使用すると、再びインスタンス化されるためです。

オブジェクトの所有権を取得したい場合は、通常どおりにオブジェクトをインスタンス化する必要があります。そうすれば、オブジェクトを保持して解放できます。

また、それが「適切な」シングルトンではないことについてのセルジオの編集を読んでください。:p

また、可能であれば、ARCに変換すれば、これについて心配する必要はありません。

于 2012-09-03T16:06:03.723 に答える
1

Uはそれを間違っています。検討:

activityViewForViewを複数回呼び出すと、同じオブジェクトを何度も取得することはありません。それは新しいオブジェクトを初期化し、それへのポインタを与えるだけです!!!

これをシングルトンにするには、作成したオブジェクトを定数変数に格納し、アプリの実行中は常にこのオブジェクトへの参照があることを確認する必要があります(たとえば、appDelegateでこのオブジェクトへのポインターを宣言します)。

次に、呼び出すたびactivityViewForViewに、定数変数が有効なオブジェクトを指しているかどうかを確認する必要があります。有効なオブジェクトを返し、そうでない場合は、オブジェクトを作成して定数静的変数に格納します(作成は1回だけ行われます)。

ARCを使用する場合は、これで準備は完了です。そうでない場合は、オブジェクトを解放します(deallocメソッドを使用します)

于 2012-09-03T16:17:59.373 に答える