0

私はiOSアプリを開発していて、メモリリークがないかテストしたいのですが、

clang静的アナライザー

そしてそれは私にこのバグレポートを与えます

-(void)pass
{
printf("reading plist info");   
// Path to the plist (in the application bundle)
NSString *path = [[NSBundle mainBundle] pathForResource:
                  @"sortednames" ofType:@"plist"];

// Build the array from the plist  
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];

for (id key in dict) {
    NSLog(@"bundle: key=%@, value=%@", key, [dict objectForKey:key]);
    string_values=[dict objectForKey:key];
    //NSLog(@"bundle data: key=%@, value=%@", key, [string_values objectAtIndex:0]);
}
//[dict release];
}

アナライザーによって提供される情報は 私は今しますか?

そしてもう1つ、私のアプリのメモリ管理には十分ですか????
または私はいくつかのより多くのタスクを実行する必要があります???
返信ありがとうございます

4

2 に答える 2

2
string_values = [[dict objectForKey:key] **retain**];

強力な/保持プロパティを合成し、self.string_valuesを介してivarを割り当てる必要があります。その後、辞書を解放しても、string_valueは引き続き有効です。

...
@property(nonatomic, retain)NSString* string_value;
...
@synthetyse string_value;
...

それから

self.string_values = [dict objectForKey:key];

いいえ、静的アナライザはメモリリークの防弾ではありません。アルゴリズム的には計算時間のリークを見つけることができますが、実行時のリークは見つけることができません。それが静的アナライザーと呼ばれる理由です。でも、ちなみに本当に助かります!

次に、アプリのプロファイルを作成し、リークツールを使用して、他のリークをチェックできます。

于 2013-02-27T12:45:07.800 に答える
0

NSDictionaryのオブジェクトを直接使用できます。割り当てる必要はありません。このように使用できます。

NSString *path = [[NSBundle mainBundle] pathForResource:
                  @"sortednames" ofType:@"plist"];

dict = [NSDictionary dictionaryWithContentsOfFile: 
                         path];

それがあなたを助けることを願っています。

于 2013-02-27T12:45:17.893 に答える