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つの方法は次のとおりです。
- 使用する
autorelease
- インライン割り当てを次のコードに置き換えます。
(コード)
PaxCompartimentOutputField *field = [[PaxCompartimentOutputField alloc] initWithPerson:passenger];
[paxCompartiments addObject:field];
[field release];
最初のオプションは廃止されたimhoです(特にiOSではその使用はお勧めしません)2番目のオプションはかなりかさばります-特により多くのオブジェクトで配列を作成する場合(たとえば、デフォルト設定をロードする10個のオブジェクト)。
Clangの警告は、バグやリークを見つけるための優れたツールであるため、無視したくありません。これらの場合、Objective-Cでこれを行うための「正しい」方法は何ですか?