0

次のコードを使用して NSMutableArray を作成しています。「プロファイル」モードで同じものを実行すると、メモリ リークが発生します。

SampleArray.h

@interface SampleArray: NSObject {
}
@property (assign, retain) NSMutableArray *array;
@end

SampleArray.m

#import "SampleArray.h"
@implementation SampleArray
@synthesize array;
-(void) viewDidLoad {
    self.array =[ [NSMutableArray alloc] init];
}

-(void) viewWillDisappear:(BOOL)animated {
    [self.array release];
}
@end

autorelease を使用している場合、他の関数またはメソッドで同じものにアクセスして null 値を返すことができません。問題を見つけるのを手伝ってください。

4

4 に答える 4

1

この配列をviewWilLDisappearで解放することはお勧めできません。dealloc関数で解放する必要があります。このViewControllerの存続期間中にviewWilLDisappearが複数回呼び出される可能性があるため、このアイテムを過剰にリリースしてプログラムがクラッシュすることを心配する必要があります。

とにかく、プロパティには保持があるため(割り当てではなく非アトミックにする)、アイテムを二重に保持し、alloc/initに自動リリースを追加します。

self.array =[[[NSMutableArray alloc] init] autorelease]; 

移動します

[array release];

あなたのdealloc関数に。または、ARCに変換して、もう心配する必要はありません...

于 2012-08-22T15:56:03.537 に答える
0

まず第一に、私はあなたが使用していると仮定しています

@property (nonatomic, retain) NSMutableArray *array;

これを使って

-(void) viewDidLoad {
    array =[[NSMutableArray alloc] init];
}

-(void) viewWillDisappear:(BOOL)animated {
    [array release];
}

代わりに dealloc を使用することをお勧めしますviewWillDisappear

-(void) dealloc {
    [array release];
    [super dealloc];
 }

コードの説明

   -(void) viewDidLoad {
        // here you are allocating a mutable array thus retain count becomes one
        // then you are assigning it to the property which is retain and thus retains it
        // making the retain count 2
        self.array =[ [NSMutableArray alloc] init];
    }

    -(void) viewWillDisappear:(BOOL)animated {
        // here you are releasing it so its retain count becomes 1 from 2
        // thus shows memory leak
        [self.array release];
    }
于 2012-08-22T16:03:19.360 に答える
0

-dealloc() でメモリの割り当て解除を処理し、配列を nil に設定して、-viewDidUnload() でより安全にすることをお勧めします。

したがって、次のようになります。

-(void) viewDidUnload 
{
    self.array = nil;
}

-(void) dealloc
{
    [array release];

    [super dealloc];
}

他の人が言ったように、あなたの財産を(代入、保持)ではなく(非アトミック、保持)として宣言してください

于 2012-08-22T16:04:40.190 に答える