2011-07-15 17 views
0

UIViewControllerでNSMutableArrayを解放してメモリリークが発生し、ViewDidLoadで配列がallocsされて配列に挿入され、オブジェクトが追加されます。ビューが閉じると、dealloc()は各配列オブジェクトを解放し、配列を解放します。NSMutableArrayを解放しようとするとリークが発生する

通常、リークが発生します。

私の基本的な構造:...

...m file: 

NSMutableArray* foo; 

@implementation .... 

viewDidLoad 
{ 
[[foo alloc] init]; 
... 
} 

dealloc 
{ 
    for i = each foo object: 
    [foo objectAtIndex: i] release]; 

    [foo release]; 
} 

...

+0

あなたが本当にそれぞれを解放するループのために実行する必要がありますオブジェクトの?配列自体が解放されると、配列内の各項目に 'release'メッセージが送られると思います。 –

+0

実際のコードを追加してください。そのため、配列に追加したオブジェクトを解放する必要はありません。配列はそれらを保持し、割り当てが解除されると解放します。 –

+0

@Deepak yは私にdownvoteをした –

答えて

1

この場合のリークは、あなたの配列のアイテムは、他の場所でretain編されているときに発生することができます。そのアイテムにメッセージreleaseを送信すると、保持カウントが減少し、実際にそれをデアロックしません。

1

NSMutableArrayを解放するとき、NSMutableArrayはすべての子を解放します。同じことが

は、それを合成し、その後、あなたのヘッダーにインスタンス変数としてFOOを設定してみてください

などなどにNSArray、NSMutableDictionary、NSDictionaryの、のために行く:

...h file 
@interface MyObject : NSObject { 
    NSMutableArray* foo; 
} 

@property (nonatomic, retain) NSMutableArray *foo; 

...m file 
@implementation .... 
@synthesize foo; 

viewDidLoad 
{ 
    self.foo = [[NSMutableArray alloc] init]; 
    ... 
} 

dealloc 
{ 
    [foo release]; 
} 
+1

どういうわけか彼は彼がリークを取得している必要があります理由は、ここでほぼ同じことをやっていると思う。 'self.foo = [[NSMutableArray alloc] init];'には2つの保持があり、最後に1回だけ解放します。 –

+1

良い点。その周りにオートリリースをラッピングすることができます... – coryjacobsen

関連する問題