2011-01-11 13 views
0

私は "出力"と呼ばれるNSMutableDictionaryを持っており、NSStringを整数に追加しています。これを行う適切な方法は何ですか?私はそれを理解することはできません。私が試したことはすべてメモリリークを与えることに終わります。メモリ管理 - 目的C NSString

これは私が現在持っているものです。

valがint型

COUNTRYNAMEはここでNSStringの

です私は、 "出力" を宣言する方法をされています。ここでは

NSMutableDictionary *output = [[[NSMutableDictionary alloc] init] autorelease]; 

がされメモリリークの原因となるコード:

NSString *temp = [NSString stringWithFormat:@"%d",val]; 
[output setValue:temp forKey:countryName]; 

以下もリークが発生:

NSString *temp = [[NSString alloc] initWithFormat:@"%i",val]; 
[output setValue:temp forKey:source]; 
[temp release]; 
+2

投稿した内容は正常です。なぜメモリリークがあり、どのオブジェクトが漏れていると思いますか? – Jonah

+0

ちょうど好奇心から、なぜあなたは '%i'の代わりに'%d'を使用していますか? –

+0

私はInstrumentsでアプリケーションを実行しましたが、私はその行に100%のメモリリークがあることを示しました。 – CodeGuy

答えて

0

は一時変数が整数変数を格納するか、されていないことを確認するために、この

NSLog("number = %d", [temp intValue]);

ようなプリントの一時変数しよう。

あなたはNSMutableDictionaryを宣言するために使用したコードを投稿することもできます。そこに宣言の問題がいくつか見つかります。

+0

ここに "出力"の宣言があります:\t NSMutableDictionary * output = [[[NSMutableDictionary alloc] init] autorelease]; – CodeGuy

+0

ここでは、100%のメモリリークを取得するコードです:\t \t \t NSString * temp = [NSString stringWithFormat:@ "%d"、val]; \t \t \t [出力setValue:temp forKey:keywordName]; – CodeGuy

+0

オブジェクトを目的関数で返す前に自動解放することもできます。 – Robin

2

計測器は、漏れたオブジェクトの作成元をあなたに示します。コードスニペットは問題ありません。これは後で出力(または一時的なもの)からの値にアクセスし、そのサイトから過剰に保持することを意味します。

+0

"出力"が返されていますが、そのサイトからの過剰保持はどういう意味ですか? – CodeGuy

+0

これは、(最も一般的な例)あなたがキーにアクセスすることを意味します:関数/メソッドの結果から 'countryName'(別名'出力 '、あなたが返す)。 countryNameの値にアクセスするコードのセクションは、保持する必要がない場合には、メッセージ「retain」によって参照カウントの不均衡を導入します。 – justin

0

値のコピーを作成してから、setValueを可変ディクショナリに戻す必要があります。それから解放する。

NSMutableDictionary *copyOfItem = [item copy]; 
[tmpMarkers addObject: copyOfItem]; 
[copyOfItem release], copyOfItem = nil;