2

モデルには、そのプロパティを含む NSDictionary オブジェクトを作成する簡単なメソッドがあります。残念ながら、このメソッドは「分析」によってメモリリークが発生していると見なされます。

76 行目 (ここではドットでマークされています) に割り当てられ、「dic」に格納されているオブジェクトのメモリ リークの可能性があります。

-(NSDictionary*) getDictionary {
    NSDictionary *dic = [[NSDictionary alloc] init];

    [dic setValue:(id)self.internal_code forKey:@"internal_code"];
    [dic setValue:(id)self.identifier forKey:@"id"];
    [dic setValue:(id)self.owner forKey:@"owner"];
    [dic setValue:(id)self.address forKey:@"address"];
    [dic setValue:(id)self.displayed_name forKey:@"displayed_name"];

    return dic;
}

私はARCを使用していません。

PS : 入ってきた人たちへ、私が投稿した元のコードは正しいものでした — 自動リリースがありました。後で編集したので、メモリリークが再発し、正確な理由を尋ねました。

4

2 に答える 2

0

以下のように dic を返しながら自動解放を試みます

return[dic autorelease];
于 2012-06-06T11:50:16.027 に答える
0

alloccopymutableCopyまたはで始まらないメソッドからオブジェクトを返す場合new、そのオブジェクトは autoreleased として返される必要があります。

より概念的には、それを返すときにコードによって所有されるべきではありません。alloccopymutableCopyまたはを入力すると、オブジェクトの所有権が取得されますnewreleaseまたはと入力すると、所有権を放棄しますautorelease

return ステートメントを次のように変更できます。

return [dic autorelease];

または、alloc/ init/autoreleaseすべてを 1 行にまとめてコードを確認しやすくし、コードをコピーして貼り付けるときに alloc と release が誤って分離されないようにすることをお勧めします。

NSDictionary *dic = [[[NSDictionary alloc] init] autorelease];

さらに簡単な方法は、次の便利なコンストラクターを使用することですNSDictionary

NSDictionary *dic = [NSDictionary dictionary];

上記の行は、メモリ リークを修正します。ただし、不変型 ( NSDictionary) も変更しようとしています。代わりに可変辞書を使用する必要があります。

NSMutableDictionary *dic = [NSMutableDictionary dictionary];

最後に、理想的にはsetObject:forKey:メソッドで値を設定する必要がありますが、これsetValue:forKey:も機能します。

メモリ管理の詳細については、『Advanced Memory Management Programming Guide』を参照してください。

iOS 4 以降をターゲットにしている場合は、ARC を使用することを強くお勧めします。

于 2012-06-06T11:58:56.053 に答える