2012-02-28 13 views
1

私はiOSプログラミングを初めて利用しており、クライアント用のアプリケーションを開発しました。しかし、Instrumentsを使用してアプリケーションを実行すると、辞書が原因でメモリリークの問題が発生するようですが、リリースすればアプリケーションがクラッシュします。私は問題が何であるか分かりません。辞書によるiOSメモリリーク

これは楽器の画像です:http://www.flickr.com/photos/[email protected]/6791493522/in/photostream/

-(void) generateLiquidProductData:(NSArray*) liquidProduct { 

    int _count = 52; 

    self.liquidProductData = [[NSMutableArray alloc] initWithCapacity:_count]; 

    for (int i = 0; i < _count; i++){ 

     float x = i; 
     float y; 

     if ((liquidProduct != (id)[NSNull null]) && (liquidProduct != nil) && ([liquidProduct count] != 0)) { 

      y = [[liquidProduct objectAtIndex:i] floatValue]; 
      y = round(y * 10000.0f)/10000.0f; 
     } 
     else { 

      y = 0.0; 
      y = round(y * 10000.0f)/10000.0f; 
     } 

     NSDictionary* _gotLiquidProduct = [NSDictionary dictionaryWithObjectsAndKeys: 
               [NSNumber numberWithDouble:x],X_VAL, 
               [NSNumber numberWithDouble:y],Y_VAL, 
               nil]; 
     NSLog(@"This is y %.5f", y); 
     [self.liquidProductData addObject:_gotLiquidProduct]; 
    } 
} 
+0

行self.liquidProductData = [[NSMutableArray alloc] initWithCapacity:_count]; はリークの原因になります。セッターを使用するので、liquidProductDataプロパティが保持されていると、リークが発生します。 代わりにautoreleaseを追加するか、自動解放メソッド[NSMutableArray arrayWithCapacity:] – AmineG

答えて

1

メモリリークがこのラインによるものです:

self.liquidProductData = [[NSMutableArray alloc] initWithCapacity:_count]; 

ほとんどの場合、プロパティは通常、旧(のいずれかであるretaincopyとしてマーク)。 allocは後でreleaseに必要参照を所有を返すため

self.liquidProductData = [NSMutableArray arrayWithCapacity:_count]; 

漏れがあるが、あなたはそれを解放しません。それを使用する正しい方法は次のようになります。インスタンスを保持するプロパティにこれを割り当てます。 「相対保持カウント」は+2になりました。このプロパティに新しい値を割り当てると、古いインスタンスが解放されますが、これにより「相対保持カウント」が+1になるだけで、インスタンスは決して解放されません。また、リークした配列によって保持されているため、辞書とその値もリークします。

+0

を使用することができますが、このプロパティを最初に使用しているので、割り当てを行わずに入力できますか? – Retro

+0

'[NSMutableArray arrayWithCapacity:]'も同様に割り当てていますが、非所有参照を返します。つまり、明示的に解放する必要はありません。このオブジェクトはあなたのプロパティに割り当てられ、このプロパティは現在そのプロパティを保持します。 – DarkDust

+0

ああ!、お時間をありがとう、私は本当にコンセプトを理解させる!どうもありがとうございました。 – Retro

1

名前の冒頭にinitがあると、返されるオブジェクトは決してオートレリースされないので、それを解放するのはあなたの責任です。

"arrayWith" "stringWith"のような 'type'で始まるメソッドは、オートレリースされたオブジェクトを返します。

静的解析を使用してこの種のリークを見つけることができます。これは本当に簡単です。 Xcode static analysis

+0

Closeですが、所有参照を返す 'init'ではなく' alloc'です。 [Advanced Memory Management Programming Guide](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html)、基本メモリ管理ルール*を参照してください。 – DarkDust

+0

申し訳ありませんが、私はその詳細に感謝しなかった:) – Ganzolo