2

Clang静的アナライザーを使用してiOS用のObjective-Cコードを分析すると、多くの「潜在的なリーク」が発生します。リークの多くは、なぜそれがまったく間違っているのか疑問に思います。特に疑問に思った一例は次のとおりです。

NSDictionaryいくつかの設定を格納するために使用される、タイプのクラス変数があります。辞書内で何かを変更する方法がある場合:

- (void) loadPassengerCompartiments {
    NSMutableArray *paxCompartiments = [self.outputTable objectAtIndex:2];
    NSArray *paxCompSrc = [self.values objectForKey:@"PassengerCompartiments"];

    for(MassPerson *passenger in paxCompSrc) {
=>      [paxCompartiments addObject:[[PaxCompartimentOutputField alloc] initWithPerson:passenger]];
    }
}

Clangは、のインライン割り当てと直接関連付けでエラーが発生しPaxCompartimentOutputFieldます。このコードを機器で実行する場合、リークは発生しません。

これを解決するために私が思いつくことができる2つの方法は次のとおりです。

  1. 使用するautorelease
  2. インライン割り当てを次のコードに置き換えます。

(コード)

PaxCompartimentOutputField *field = [[PaxCompartimentOutputField alloc] initWithPerson:passenger];
[paxCompartiments addObject:field];
[field release];

最初のオプションは廃止されたimhoです(特にiOSではその使用はお勧めしません)2番目のオプションはかなりかさばります-特により多くのオブジェクトで配列を作成する場合(たとえば、デフォルト設定をロードする10個のオブジェクト)。

Clangの警告は、バグやリークを見つけるための優れたツールであるため、無視したくありません。これらの場合、Objective-Cでこれを行うための「正しい」方法は何ですか?

4

2 に答える 2

8

それはリークです。

あなたはalloc-initなのでPaxCompartimentOutputField、あなたはそれを所有し、あなたはそれの所有権を放棄しなければなりません。

3つのオプションがあります(すでに2つ言及しています):

1)便利なコンストラクターが利用可能な場合はそれを使用するか、カスタムクラスで宣言します。コンビニエンスコンストラクターは、通常、返すオブジェクトにメッセージを送信することにより、所有していないオブジェクトを返します。autorelease次のようになります。

[paxCompartiments addObject:[PaxCompartimentOutputField paxCompartimentOutputWithPerson:passenger]];

2)を使用しautoreleaseます。

[paxCompartiments addObject:[[[PaxCompartimentOutputField alloc] initWithPerson:passenger]] autorelease];

3)一時変数を使用します。

PaxCompartimentOutputField *tempField = [[PaxCompartimentOutputField alloc] initWithPerson:passenger];
[paxCompartiments addObject:tempField];
[tempField release];
于 2011-07-22T19:11:48.870 に答える
2

Clangで使用できるソースアノテーションのリストがあります。

これらは役立つかもしれません。

于 2011-07-22T19:03:32.067 に答える